N
表现层
WEB前端
AJAX
业务逻辑层
WEB后端
数据访问层(或持久层)
数据库
// ......
// sql语句写死在java程序中
String sql = "insert into t_user(id,idCard,username,password,birth,gender,email,city,street,zipcode,phone,grade) values(?,?,?,?,?,?,?,?,?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
// 繁琐的赋值:思考一下,这种有规律的代码能不能通过反射机制来做自动化。
ps.setString(1, "1");
ps.setString(2, "123456789");
ps.setString(3, "zhangsan");
ps.setString(4, "123456");
ps.setString(5, "1980-10-11");
ps.setString(6, "男");
ps.setString(7, "zhangsan@126.com");
ps.setString(8, "北京");
ps.setString(9, "大兴区凉水河二街");
ps.setString(10, "1000000");
ps.setString(11, "16398574152");
ps.setString(12, "A");
// 执行SQL
int count = ps.executeUpdate();
// ......
// ......
// sql语句写死在java程序中
String sql = "select id,idCard,username,password,birth,gender,email,city,street,zipcode,phone,grade from t_user";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
List<User> userList = new ArrayList<>();
// 思考以下循环中的所有代码是否可以使用反射进行自动化封装。
while(rs.next()){
// 获取数据
String id = rs.getString("id");
String idCard = rs.getString("idCard");
String username = rs.getString("username");
String password = rs.getString("password");
String birth = rs.getString("birth");
String gender = rs.getString("gender");
String email = rs.getString("email");
String city = rs.getString("city");
String street = rs.getString("street");
String zipcode = rs.getString("zipcode");
String phone = rs.getString("phone");
String grade = rs.getString("grade");
// 创建对象
User user = new User();
// 给对象属性赋值
user.setId(id);
user.setIdCard(idCard);
user.setUsername(username);
user.setPassword(password);
user.setBirth(birth);
user.setGender(gender);
user.setEmail(email);
user.setCity(city);
user.setStreet(street);
user.setZipcode(zipcode);
user.setPhone(phone);
user.setGrade(grade);
// 添加到集合
userList.add(user);
}
// ......
MYBATIS-3.5.10JAR\ORG\APACHE-解包大小为3.5 MB
压缩前
名称
..(上级目录)
IBATIS
R
M
CUS OMER
CLASS
CUSTOMER
"PROPERTIES
R CUSTOMERID
FIRSTNAME
VERSION
PI
FIRSTNAME
LASTNAME
LASTNAME
VERSION
ORM
DB
类
数据表
对象
数据行
字段
属性
N
README.MD
MYBATIS SQL MAPPER FRAMEWORK FORK FOR
FOR JAVA
3.5.10
JAVA CI
STACK OVERFLOW MYBATIS
87%
V3.5.11-SNAPSHOT
LICENSE
APACHE
COVERAGE
MAVEN CENTRA
PASSING
NEXUS
$3.72M COST
OPEN HUB
MYBATIS
THE MYBATIS SQL MAPPER FRAMEWORK MAKES IT EASIER TO USE A RELATIONAL DATABASE WITH OBJENTED APPLICATI
MYBATIS COUPLES OBJECTS WITH STORED PROCEDURES OR STATEMENTS USING AN XML DESCRIPTOR OR ANNOTATICITY
IS THE BIGGEST ADVANTAGE OF THE MYBATIS DATA MAPPER OVER OVER OBJECT RELATIONAL MAPPING TOOLS.
ESSENTIALS
SEE THE DOCS
DOWNLOAD LATEST
DOWNLOAD SNAPSHOT
MYBATIS-3.10
24 MAY 2022
LATEST
HARAWATA
BUG FIXES:
MYBATIS-3.5.10
0D3C604
@GAL REFLECTIVE ACCESS WARNING (OR INACCESSIBLEOBJECTEXCEPTION ON JAVA 16+
UNEXPECTED ILLEGAL
COMPARE
OGNL EXPRESSION.#2392
ILLEGALACCESSEXCEPTION WHEN AUTO-MAPPING RECORDS (JEP-359)#2195
'INTERRUPTED' STATUS IS NOT SET WHEN POOLEDCONNECTION#GETCONNECTION() IS INTERRU
S INTERRUPTED. #250
ENHANCEMENTS:
A NEW OPTION ARGHAMEBASEDCONSTRUCTORAUTOLLAPPING IS ADDED.IF ENABLED, CONSTRUCTOR ARGUN
UP COLUMNS WHEN AUTO-MAPPING.#2192
ADDED
ANEW PROPERTY SKIPSETAUTOCOMMITONCLOSE TO JDBCTRANSACTIONFACTORY . SKIPPING
IMPROVE
PERFORMANCE WITH SOME DRIVERS.#2426
<IDARG /> CAN NOW BE LISTED AFTER <ARG /> IN <CONSTRUCTOR />.#2541
THERE IS NO KNOWN BACKWARD INCOMPATIBLE CHANGE SINCE 3.5.9.
PLEASE SEE THE 3.5.10 MILESTONE PAGE FOR THE COMPLETE LIST OF CHANGES.
ASSETS
3
MYBATIS框架
3.69 MB
MYBATIS-3.5.10.ZIP
MYBATIS框架源码(WINDOWS压缩格式)
SOURCE CODE
(ZIP)
MYBATIS框架源码(LINUX压缩格式)
SOURCE CODE(TAR.GZ)
12
15 PEOPLE REACTED
LIB
MYBATIS核心
LICENSE
MYBATIS-3.5.10JAR
官方手册
MYBATIS-3.5.10.PDF
NOTICE
T_CAR@POWERNODE(LOCALHOST)-表
对象
保存
添加字段
个上移
下移
删除字段
主键
插入字段
字段
触发器选项注释
SQL预览
索引
外键
检查
注释
键
名
不是NULL
类型
长度
虚拟
小数点
ID
BIGINT
主键自增
1
汽车编号
255
VARCHAR
CAR NUM
汽车品牌
255
BRAND
VARCHAR
厂家指导价
DECIMAL
10
GUIDE_PRICE
生产日期
10
CHAR
PRODUCE TIME
汽车类型,包括;燃油车,电车,氢能源
255
VARCHAR
CAR TYPE
对象
T_CAR@POWERNODE(LOCALHOST)-表
开始事务
导出曲数据生成叫)创建图表
文本7筛选,三排序[6导入
ID
BRAND
GUIDE PRICE
PRODUCE TIME
CAR TYPE
CAR NUM
燃油车
宝马520LI
1100
41.00 2022-09-01
奔驰E300L
54.00 2022-08-01
电车
2101
IJ
NEW PROJECT
A BASIC PROJECT THAT ALLOWS WORKING WITH SEPARATE FLES AND COMPILING JAVA AND KOTLIN DASSES.
NEW PROJECT
EMPTY PROJECT
MYBATIS
NAME:
GENERATORS
D://POWERNODE\MYBATIS/CODE
LOCATION:
MAVEN ARCHETYPE
PROJECT WILL BE CREATED IN: D:\POWERNODE\MYBATIS\CODE\MYBATIS
JAVA ENTERPRISE
CREATE GIT REPOSITORY
SPRING INITIALIZR
JAVAFX
QUARKUS
MICRONAUT
KTOR
KOTLIN MULTIPLATFORM
COMPOSE MULTIPLATFORM
HTML
REACT
EX EXPRESS
ANGULAR CLI
IDE PLUGIN
CANCEL
CREATE
PROJECT STRUCTURE
PROJECT
PROJECT SETTINGS
DEFAULT SETTINGS FOR ALL MODULES. CONFIGURE THESE PARAMETERS FOR EACH MODULE ON THE MODULE PAGE
PROJECT
MODULES
NAME:
MYBATIS
LIBRARIES
FACETS
SDK:
EDIT
17 ORACLE OPENJDK VERSION 17.0.4
ARTIFACTS
PLATFORM SETTINGS
LANGUAGE LEVE3
17 - SEALED TYPES, ALWAYS-STRICT FLOATING-POINT SEMANTICS
SDKS
GLOBAL LIBRARIES
D:/POWERNODE\MYBATIS/CODE\MYBATIS/OUT
COMPILER OUTPUT:
USED FOR MODULES' SUBDIRECTORIES, PRODUCTION AND TEST DIRECTORIES FOR THE CORRES
PROBLEMS
SETTINGS
BUILD, EXECUTION, DEPLOYMENT > BUILD TOOLS > MAVEN
RESET
APPEARANCE & BEHAVIOR
WORK OFFLINE
QUICK LISTS
USE PLUGIN REGISTRY
PATH VARIABLES
EXECUTE GOALS RECURSIVELY
KEYMAP
PRINT EXCEPTION STACK TRACES
EDITOR
ALWAYS UPDATE SNAPSHOTS
PLUGINS
VERSION CONTROL
OUTPUT LEVEL:
INFO
BUILD,
D,EXECUTION,DEPLOYMENT
CHECKSUM POLICY:
NO GLOBAL POLICY
BUILD TOOLS
口
MULTIPROJECT BUILD FAIL POLICY:
DEFAULT
口
MAVEN
GRADLE
回
THREAD COUNT
TOPTION
GANT
C:/DEV/APACHE-MAVEN-3.8.6
MAVEN HOME PATH
COMPILER
回
(VERSION:3.8.6)
DEBUGGER
C\DEV\APACHE-MAVEN-3.8.6\CONF SETTINGS.XML
USER SETTINGS FILE:
ERRIDE
REMOTE JAR REPOSITORIES
口
DEPLOYMENT
E:\REPOSITORY
OVERRIDE
LOCAL REPOSITORY:
ANDROID
USE SETTINGS FROM MVN/MAVEN.CONFIG
APPLICATION SERVERS
COVERAGE
DOCKER
GRADLE-ANDROID COMPILER
JAVA PROFILER
PACKAGE SEARCH
REQUIRED PLUGINS
CANCEL
APPLY
OK
JJ
NEW MODULE
MYBATIS-001-INTRODUCTION
NAME:
NEW MODULE
D:/POWERNODE\MYBATIS/CODE\MYBATIS
LOCATION:
GENERATORS
MODULE WILL BE CREATED IN:D:/POWERNODE\MYBATIS(CODE\MYBATIS(MYBATIS-001-INT
M MAVEN ARCHETYPE
JAVA ENTERPRISE
十
GROOVY
JAVASCRIPT
JAVA
LANGUAGE:
SPRING INITIALIZR
MAVEN
BUILD SYSTEM:
INTELLIJ
GRADLE
JAVAFX
QUARKUS
PROJECT SDK 17
JDK:
MICRONAUT
ADD SAMPLE CODE
KTOR
5
COMPOSE MULTIPLATFORM
DVANCED SETTINGS
HTML
GROUPLD:
COM.POWERNODE
REACT
ARTIFACTLD:
MYBATIS-001-INTRODUCTION
EX EXPRESS
ANGULAR CLI
IDE PLUGIN
7
ANDROID
CREATE
CANCEL
<groupId>com.powernode</groupId>
<artifactId>mybatis-001-introduction</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!--mybatis核心依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--sql映射文件创建好之后,需要将该文件路径配置到这里-->
<mapper resource=""/>
</mappers>
</configuration>
<!--namespace先随意写一个-->
<mapper namespace="car">
<!--insert sql:保存一个汽车信息-->
<insert id="insertCar">
insert into t_car
(id,car_num,brand,guide_price,produce_time,car_type)
values
(null,'102','丰田mirai',40.30,'2014-10-05','氢能源')
</insert>
</mapper>
<mapper resource="CarMapper.xml"/>
package com.powernode.mybatis;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
/**
* MyBatis入门程序
* @author 老杜
* @since 1.0
* @version 1.0
*/
public class MyBatisIntroductionTest {
public static void main(String[] args) {
// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 创建SqlSessionFactory对象
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 3. 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4. 执行sql
int count = sqlSession.insert("insertCar"); // 这个"insertCar"必须是sql的id
System.out.println("插入几条数据:" + count);
// 5. 提交(mybatis默认采用的事务管理器是JDBC,默认是不提交的,需要手动提交。)
sqlSession.commit();
// 6. 关闭资源(只关闭是不会提交的)
sqlSession.close();
}
}
MYBATISLNTRODUCTIONTEST
RUN:
C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE
"-J
插入几条数据:1
PROCESS
FINISHED WITH EXIT CODE O
回转
对象
T_CAR@POWERNODE(LOCALHOST)-表
目开始事务
目文本?筛选,三排序
00创建图表
导出
[6导入
曲数据生成
BRAND
PRODUCE TIME
GUIDE PRICE
CAR TYPE
CAR NUM
燃油车
宝马520LI
100
41.00 2022-09-01
奔驰E300L
101
电车
54.00
2022-08-01
丰田MIRAI
102
氢能源
40.30|2014-10-05
// 文件名是出现在程序中的,文件名如果修改了,对应这里的java程序也改一下就行了。
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
package com.powernode.mybatis;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.FileInputStream;
import java.io.InputStream;
/**
* 测试mybatis核心配置文件路径问题
* @author 老杜
* @since 1.0
* @version 1.0
*/
public class MyBatisConfigFilePath {
public static void main(String[] args) throws Exception{
// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 创建SqlSessionFactory对象
// 这只是一个输入流,可以自己new。
InputStream is = new FileInputStream("D:/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 3. 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4. 执行sql
int count = sqlSession.insert("insertCar");
System.out.println("插入几条数据:" + count);
// 5. 提交(mybatis默认采用的事务管理器是JDBC,默认是不提交的,需要手动提交。)
sqlSession.commit();
// 6. 关闭资源(只关闭是不会提交的)
sqlSession.close();
}
}
对急
T_CAR@POWERNODE(LOCALHOST)-表
目开始事务
[6导入C导出曲数据生成DYLY)创建图表
文本?筛选了排序
ID
CAR TYPE
BRAND
PRODUCE TIME
GUIDE_PRICE
CAR NUM
燃油车
宝马520LI
41.00 2022-09-01
100
2 101
奔驰E300L
电车
54.00 2022-08-01
氢能源
丰田MIRAI
4 102
2014-10-05
40.30
102
40.30
氧能源
2014-10-05
丰田MIRAI
// 这种方式只能从类路径当中获取资源,也就是说mybatis-config.xml文件需要在类路径下。
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
package com.powernode.mybatis;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
/**
* 比较完整的第一个mybatis程序写法
* @author 老杜
* @since 1.0
* @version 1.0
*/
public class MyBatisCompleteCodeTest {
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
// 1.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2.创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 3.创建SqlSession对象
sqlSession = sqlSessionFactory.openSession();
// 4.执行SQL
int count = sqlSession.insert("insertCar");
System.out.println("更新了几条记录:" + count);
// 5.提交
sqlSession.commit();
} catch (Exception e) {
// 回滚
if (sqlSession != null) {
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 6.关闭
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
对象
T.CAR@POWERNODE(LOCALHOST)-表
6导入[9导出
目开始事务
自文本?筛选,三排序
出数据生成0.创建图表
ID
GUIDE PRICE
BRAND
PRODUCE TIME
CAR TYPE
CAR NUM
宝马520LI
燃油车
41.00 2022-09-01
100
奔驰E300L
电车
5400 2022-08-01
2101
丰田MIRAI
氢能源
40.30 2014-10-05
4 102
丰田MIRAI
氢能源
5 102
40.30
2014-10-05
丰田MIRAI
40.30
2014-10-05
氢能源
102
<!-- junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
// 测试用例
public class CarMapperTest{
// 测试方法
@Test
public void testInsert(){}
@Test
public void testUpdate(){}
}
package com.powernode.mybatis;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
public class CarMapperTest {
@Test
public void testInsertCar(){
SqlSession sqlSession = null;
try {
// 1.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2.创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 3.创建SqlSession对象
sqlSession = sqlSessionFactory.openSession();
// 4.执行SQL
int count = sqlSession.insert("insertCar");
System.out.println("更新了几条记录:" + count);
// 5.提交
sqlSession.commit();
} catch (Exception e) {
// 回滚
if (sqlSession != null) {
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 6.关闭
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
对象
T_CAR@POWERNODE(LOCALHOST)-表
自文本?筛选,三排序
[6导入[导出
数据生成00创建图表
开始事务
P!
BRAND
GUIDE_PRICE
PRODUCE TIME
CAR TYPE
CAR NUM
宝马520LI
燃油车
41.00
1100
0 2022-09-01
电车
奔驰E300L
2 101
5400 2022-08-01
氢能源
40.30 2014-10-05
丰田MIRAI
4 102
氢能源
丰田MIRAI
40.30 2014-10-05
102
氢能源
丰田MIRAI
40.30 2014-10-05
6102
氧能源
40.30|2014-10-05
丰田MIRAI
102
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
<scope>test</scope>
</dependency>
<configuration debug="false">
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!--mybatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志输出级别,logback日志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR -->
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
TESTS PASSED:1 OF 1 TEST -900MS
C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE .
LY DILITH THERLY DUTHEREDILY DITHORLYBREDILIALLY
2922-08-04 18:5Z:92.966 [NAIN DEBUG ORANINACHE,TBATIONSACTION-JBBE,JBBE,JBBETRANSACTIONINA JDBE CON
2022-08-04 18:52:03.394 (MAIN] DEBUG O.APACHE.IBATIS,DATIS,DATASOURCE
CREATED CONNECTION 2126723403.
2022-98-04 18:52:93.394 [MAIN] DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBC.JDBCTRANSACTION -S
N - SETTING AUTOCOMMIT TO FALSE ON JDBC CONNECTION [COM.MYSQL.CJ.JDBC.CONNEG
2022-08-04 18:52:03.398 [MAIN] DEBUG CAR.INSERTCAR - 三> PREPE
LINSERT INTO T.CAR (ID,CAR-NUM,BRAND,GUIDE-PRICE,PRODUCE_TIME,CAR-TYPE) VALUES (NULL,'102','102','丰E
PREPARING:
2022-08-04 18:52:03.431 [MAIN] DEBUG CAR.INSERTCAR - 三> PA
PARAMETERS:
2022-08-04 18:52:03.433 [MAIN] DEBUG CAR.INSERTCAR - <三
UPDATES:
更新了几条记录:1
2022-98-04 18:52:83,437 FNAINL DEBUG ORS.APAEHO, TRANSAS.TRANSACEIONETRANSASTION - CONNITTEN JONNES
[COM.MYSQL.CJ.JDBC.CONNECTIONIMP107EC3394B]
2022-08-04 18:52:03.441 [MAIN] DEBUG ORG.APACHE.
TRUE ON JDBC CONNECTION [COM.MYSQL.CJ.JDBC.CONNEG
ORG,APACHE,IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION - RESETTING AUTOCOMMIT TO TRUE ON
2022-08-04 18:52:03.442 [MAIN] DEBUG ON
2022-08-04 18:52:03.442 [MAIN] DEBUG O.APG
SUG O-APACHE- RBATIS.DATASOURCE-POOLED ,POOLEDDATASOURCE - RETUNNED CONNECTION 2126733403 TO POOJ'
package com.powernode.mybatis.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* MyBatis工具类
*
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class SqlSessionUtil {
private static SqlSessionFactory sqlSessionFactory;
/**
* 类加载时初始化sqlSessionFactory对象
*/
static {
try {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 每调用一次openSession()可获取一个新的会话,该会话支持自动提交。
*
* @return 新的会话对象
*/
public static SqlSession openSession() {
return sqlSessionFactory.openSession(true);
}
}
@Test
public void testInsertCar(){
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL
int count = sqlSession.insert("insertCar");
System.out.println("插入了几条记录:" + count);
sqlSession.close();
}
<!--namespace先随便写-->
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values('103', '奔驰E300L', 50.3, '2022-01-01', '燃油车')
</insert>
</mapper>
// JDBC中使用 ? 作为占位符。那么MyBatis中会使用什么作为占位符呢?
String sql = "insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(?,?,?,?,?)";
// ......
// 给 ? 传值。那么MyBatis中应该怎么传值呢?
ps.setString(1,"103");
ps.setString(2,"奔驰E300L");
ps.setDouble(3,50.3);
ps.setString(4,"2022-01-01");
ps.setString(5,"燃油车");
package com.powernode.mybatis;
import com.powernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
/**
* 测试MyBatis的CRUD
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class CarMapperTest {
@Test
public void testInsertCar(){
// 准备数据
Map<String, Object> map = new HashMap<>();
map.put("k1", "103");
map.put("k2", "奔驰E300L");
map.put("k3", 50.3);
map.put("k4", "2020-10-01");
map.put("k5", "燃油车");
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句(使用map集合给sql语句传递数据)
int count = sqlSession.insert("insertCar", map);
System.out.println("插入了几条记录:" + count);
}
}
<!--namespace先随便写-->
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{k1},#{k2},#{k3},#{k4},#{k5})
</insert>
</mapper>
氢能源
丰田MIRAI
40.30 2014-10-05
27 102
丰田MIRAI
氢能源
28 102
40.30 2014-10-05
氢能源
丰田MIRAI
40.30 2014-10-05
29 102
氢能源
丰田MIRAI
40.30 2014-10-05
30 102
氢能源
丰田MIRAI
40.30 2014-10-05
31102
氢能源
丰田MIRAI
32102
2014-10-05
40.30
燃油车
33
奔驰E300L
2020-10-01
50.30
103
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{kk},#{k2},#{k3},#{k4},#{k5})
</insert>
</mapper>
TESTS PASSED:1 OF 1 TEST - 830MS
2022-08-05 10:28:08.042 [MAIN]
ALL CONNECTIONS.
HOVED ALL CONNECTIONS.
2022-08-05 10:28:08.105
[MAIN) DEBUG ORG,APACHE,IBATIS.TRANSACTION-JDBC.JDBC,JDBCTRANSACTION - OPENING JDBC CONNECTION
(MAIN) DEBUS O-APACHE,IHATIS,DATASOURCE,POOLED.POOLED CONNECTASOURCE - CREATED CONNECTION 289115397
2022-08-05 10:28:08.518 [M]
PREPARING: INSERT INTO T-CAR(CAR-NUM,BRAND,GUIDE-PRICE,PRICE,PRODUCE,CAR-TYPE) VALUES(子.???????????
2022-08-05 10:28:08.521 [MAIN] DEBUG CAR.INSERTCAR
:三> PARAMETERS: NULL) 奔驰E30OL(STRING), 50.3(DOUBLE), 2020-10-01(STRING), 然油车(STRING), 50.3(OOUBLE), 2
2022-08-05 10:28:08.552 [MAIN] DEBUG CAR.INSERTCAR
2022-08-05 10:28:08.559 [MAIN] DEBUG CAR.INSERTCAR
UPDATES:1
插入了几条记录:1
PROCESS FINISHED WITH EXIT CODE (
氧能源
丰田MIRAI
40.30 2014-10-05
28 102
氢能源
丰田MIRAI
40.30 2014-10-05
29 102
氢能源
丰田MIRAI
40.30 2014-10-05
30102
丰田MIRAI
氢能源
40.30 2014-10-0
31 102
0-05
氢能源
丰田MIRAI
40.30 2014-1
32102
0-05
奔驰E300L
燃油车
50.30 2020-10-01
33 103
奔驰E300L
50.30/2020-10-01
燃油车
34(NULL)
Map<String, Object> map = new HashMap<>();
// 让key的可读性增强
map.put("carNum", "103");
map.put("brand", "奔驰E300L");
map.put("guidePrice", 50.3);
map.put("produceTime", "2020-10-01");
map.put("carType", "燃油车");
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
</mapper>
氢能源
丰田MIRAI
40.30 2014-10-05
30 102
氢能源
丰田MIRAI
40.30 2014-10-05
31102
氢能源
丰田MIRAI
40.30 2014-10-05
32102
燃油车
奔驰E300L
50.30 2020-10-01
33 103
燃油车
奔驰E300L
50.30 2020-10-01
34(NULL)
燃油车
奔驰E300L
103
50.30|2020-10-01
35
package com.powernode.mybatis.pojo;
/**
* POJOs,简单普通的Java对象。封装数据用的。
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class Car {
private Long id;
private String carNum;
private String brand;
private Double guidePrice;
private String produceTime;
private String carType;
@Override
public String toString() {
return "Car{" +
"id=" + id +
", carNum='" + carNum + '\'' +
", brand='" + brand + '\'' +
", guidePrice=" + guidePrice +
", produceTime='" + produceTime + '\'' +
", carType='" + carType + '\'' +
'}';
}
public Car() {
}
public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {
this.id = id;
this.carNum = carNum;
this.brand = brand;
this.guidePrice = guidePrice;
this.produceTime = produceTime;
this.carType = carType;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCarNum() {
return carNum;
}
public void setCarNum(String carNum) {
this.carNum = carNum;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Double getGuidePrice() {
return guidePrice;
}
public void setGuidePrice(Double guidePrice) {
this.guidePrice = guidePrice;
}
public String getProduceTime() {
return produceTime;
}
public void setProduceTime(String produceTime) {
this.produceTime = produceTime;
}
public String getCarType() {
return carType;
}
public void setCarType(String carType) {
this.carType = carType;
}
}
@Test
public void testInsertCarByPOJO(){
// 创建POJO,封装数据
Car car = new Car();
car.setCarNum("103");
car.setBrand("奔驰C200");
car.setGuidePrice(33.23);
car.setProduceTime("2020-10-11");
car.setCarType("燃油车");
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL,传数据
int count = sqlSession.insert("insertCarByPOJO", car);
System.out.println("插入了几条记录" + count);
}
<insert id="insertCarByPOJO">
<!--#{} 里写的是POJO的属性名-->
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
丰田MIRAI
氢能源
40.30 2014-10-05
29 102
丰田MIRAI
氢能源
40.30 2014-10-05
30 102
氢能源
丰田MIRAI
40.30 2014-10-05
31 102
氢能源
丰田MIRAI
40.30 2014-10-05
32102
奔驰E300L
50.30 2020-10-01
燃油车
33 103
奔驰E300L
燃油车
50.30 2020-10-01
34(NULL)
奔驰E300L
50.30 2020-10-01
燃油车
35 103
奔驰C200
36103
33.23/2020-11
燃油车
<insert id="insertCarByPOJO">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{a},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
TESTSFAILED:1 TESTEST-820MS
2022-88-05 11:80:33.341 (MAIN) DEBIS ORG-ADECHS, CONNECTION
PREPARING: INSERT INTO T-CAR(CAR-NUM,BRAND,GUIDE-PRICE,PRODUCE,TIME,CAR-TYPE) VALUES(?
2022-08-05 11:00:33.454 [MAIN] DEBUG CAR.INSERTCARBYPOJ0
CARBYPOJO - 3E> PRE
ORG.APACHE.IBATIS.EXCEPTIONS.PERSISTENCEEXCEPTION:
N CLASS C
### THE ERROR MAY EXIST IN CARMAPPER.XML
### THE ERROR MAY INVOLVE DEFAULTPARAMETERMAP
## THE ERROR OCCURRED WHILE SETTING PARAMETERS
科科技 SQL: INSERT INTO T-CARCCAR-NUN,BRAND,GUIDE-PRICE,PRODUCE,PRODUCE-TYPE) VALUES(?????????????????
###CAT
CARMAPPER.XML
CAR.JAVA
LAPPERTESTJAVA
`*PUBLIC STRING GETCARNUM(
RETURN CARNUM;
子*/
PUBLIC STRING GETA()
RETURN CARNUM;
丰田MIRAI
氢能源
40.30 2014-10-05
32
102
奔驰E300L
50.30 2020-10-01
燃油车
33
103
奔驰E300L
50.30 2020-10-01
燃油车
34
(NULL)
奔驰E300L
50.30 2020-01
燃油车
35
103
奔驰C200
燃油车
33.23 2020-10-11
36
103
燃油车
奔驰C200
37
2020-10-11
103
33.23
<insert id="insertCar" parameterType="java.util.Map">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
<insert id="insertCarByPOJO" parameterType="com.powernode.mybatis.pojo.Car">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
<delete id="deleteByCarNum">
delete from t_car where car_num = #{SuiBianXie}
</delete>
@Test
public void testDeleteByCarNum(){
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
int count = sqlSession.delete("deleteByCarNum", "102");
System.out.println("删除了几条记录:" + count);
}
DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
[MAIN]
POOLEDDATASOURCE FORCEFULLY CLOSED/L
2022-08-05 11:57:15.926
JDBC CONNECTION
DEBUG ORG
2022-08-05 11:57:15.994 [MAIN]
OPENING
S ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
G O.APACHE.IBATIS.DATASOURCE.POOLED,POOLEDDATASOURCE
2022-08-05 11:57:16.408 [MAIN] DEBUG O.APACHE.
CREATED
CONNECTION 1429483328.
2022-08-05 11:57:16.411 [MAIN] DB
PREPARING: DELETE FROM T_CAR WHERE
DEBUG C
CAR.DELETEBYCARNUM
CAR_NUM
2022-08-05 11:57:16.441 [MAIN] DEBUG CAR.DELETEBYCARNUM
PARAMETERS:102(STRING)
L DEBUG CAR.DELETEBYCARNUM
2022-08-05 11:57:16.448 [MAIN] DEB
UPDATES:29
删除了几条记录:29
开始事务
0创建图表
导入
导出
? 筛选 ,
数据生成
文本
ID
BRAND
PRODUCE TIME
GUIDE PRICE
CARTYPE
CAR NUM
燃油车
41.00 2022-09-01
宝马520LI
100
奔驰E300L
54.00
电车
00 2022-08-01
2101
燃油车
奔驰E300L
33 103
50.30 2020-10-01
34(NULL)
燃油车
奔驰E300L
50.30/2020-10-01
奔驰E300L
燃油车
35 103
50.30 2020-10-01
燃油车
33.23 2020-10-11
奔驰C200
36 103
奔驰C200
燃油车
33.23 2020-11
37103
<update id="updateCarByPOJO">
update t_car set
car_num = #{carNum}, brand = #{brand},
guide_price = #{guidePrice}, produce_time = #{produceTime},
car_type = #{carType}
where id = #{id}
</update>
@Test
public void testUpdateCarByPOJO(){
// 准备数据
Car car = new Car();
car.setId(34L);
car.setCarNum("102");
car.setBrand("比亚迪汉");
car.setGuidePrice(30.23);
car.setProduceTime("2018-09-10");
car.setCarType("电车");
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
int count = sqlSession.update("updateCarByPOJO", car);
System.out.println("更新了几条记录:" + count);
}
DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
2022-08-05 14:35:45.374
JDBC CONNECTION
DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
2022-08-05 14:35:45.758 [MAIN] DEBUC
CREATED COL
D CONNECTION 1429483328.
2022-08-05 14:35:45.761 [MAIN] DE
1] DEBUG CAR.UPDATECARBYP0J0
PREPARING:UPDATE T_CAR SET C
T CAR-NUM ;?, BRAND ;?, GUIDE-PRICE ; ?, PRODUCE-TIME ;?, CAR-TYPE 三
, PARAMETERS: 102(STRING), 比亚迪汉(STRING), 30.23(0OUBLE), 2918-89-18(STRING), 电车(STRING), 3A(LONG), 3A(
2022-08-05 14:35:45.791 [MAIN] DEBUG CAR.UPDATECARBYP030
2022-08-05 14:35:45.798 [MAIN] DEBUG CA
CAR.UPDATECARBYP0J0
UPDATES:1
更新了几条记录:1
ID
PRODUCE TIME
BRAND
CAR.TYPE
CAR NUM
GUIDE PRICE
燃油车
1 100
宝马520LI
41.00 2022-09-01
奔驰E300L
2 101
电车
54.00 2022-08-01
奔驰E300L
燃油车
33 103
50.30 2020-10-01
比亚迪汉
30.23|2018-09-10
102
电车
34
奔驰E300L
35
燃油车
50.30 2020-10-01
103
奔驰C200
燃油车
36 103
33.23 2020-10-11
奔驰C200
燃油车
37 103
33.23 2020-10-11
<select id="selectCarById">
select * from t_car where id = #{id}
</select>
@Test
public void testSelectCarById(){
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
Object car = sqlSession.selectOne("selectCarById", 1);
System.out.println(car);
}
### Error querying database. Cause: org.apache.ibatis.executor.ExecutorException:
A query was run and no Result Maps were found for the Mapped Statement 'car.selectCarById'. 【翻译】:对于一个查询语句来说,没有找到查询的结果映射。
It's likely that neither a Result Type nor a Result Map was specified. 【翻译】:很可能既没有指定结果类型,也没有指定结果映射。
<select id="selectCarById" resultType="com.powernode.mybatis.pojo.Car">
select * from t_car where id = #{id}
</select>
TESTS PASSED:1 OF 1 TEST - 890 MS
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED
[MAIN] DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
2022-08-05 15:02:22.965
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED
2022-08-05 15:02:22.965
[MAIN] DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
2022-08-05 15:02:23.030 [MA]
30 [MAIN] DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
OPENING JDBC CONNECTION
CREATED CONNECTION 203149502.
2022-08-05 15:02:23.438 (MAIN) DEBUG O:APACHE.IBATIS,DATIS,DATASOURCE-POOLED.POOLEDDATASOURCE
WHERE ID : ?
12022-08-05 15:02:23,441 (MAIN] DEBUG CAR-SELECTCARBYID - SF) PREPARING: SELECT * FRON
T_CAR
- 三> PARAMETERS: 1(INTEGER)
[2022-08-05 15:02:23.476 [MAIN] DEBUG CAR.SELECTCARBYID
[2022-08-05 15:02:23.508 [MAIN] TRACE CAR.SELECTCARBVID
COLUMNS: ID, CAR-NUM, BRAND, GUIDE-PRICE, PRODUCE_TIME, CAR-TYPE
ROW:1,100,宝马520LI,41.00,2022-09-01,燃油车
[2022-08-05 15:02:23.508 [MAIN] TRACE CAR.SELECTCARBYID -
[2022-08-05 15:02:23.510 [MAIN] DEBUG GAR.SELECTCARBYID
TOTAL: 1
E'NULL', CARTYPE 'NULI'Y
ICAR{ID-1, CARNUMI'NULL'] BRAND;'宝马520LI', GUIDEPRICEINULL
PRODUCETIME
<select id="selectCarById" resultType="com.powernode.mybatis.pojo.Car">
select
id, car_num as carNum, brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType
from
t_car
where
id = #{id}
</select>
TESTS PASSED:1 OF 1 TEST-876MS
[MAIN] DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE - PAOLEDDATASOURC
2022-08-05 15:21:35.014
CE FORCEFULLY CLOSED/REMOVEC
[MAIN] DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBETRANSACTION - OPENING JOB
2022-08-05 15:21:35.084
G JDBC CONNECTION
IS.DATASOURCE.POOLED.POOLEDDATASOURCE - CREATED CONNECTION 20
[MAIN] DEBUG O.APACHE.IBATIS.D
2022-08-05 15:21:35.497
203149502
2022-08-05 15:21:35.500 [MAIN] DEBUG CAR.SELECTCARBYID
UM, BRAND, GUIDE_PRICE AS GUIDEPR
PREPARING: SELECT ID, CAR NUM AS CARNUM, BRE
] DEBUG CAR.SELECTCARBYID
2022-08-05 15:21:35.529 [MAIN] DE
EE> PARAMETERS: 1(INTEGER)
COLUMNS: ID, CARNUM, BRAND, GUIDEPRICE, PRODUCETIME, CARTYPE
2022-08-05 15:21:35.560
TRACE CAR.SELECTCARBYID
[MAIN]
2022-08-05 15:21:35.560
ROW:1,100,宝马520LI,41.00,2022-09-01,燃油车
CAR.SELECTCARBYID
TRACE
[MAIN]
2022-08-05 15:21:35.562 [MAIN] DEBUG CAR.SELECTCARBYID
TOTAL:1
CAR+ID1
BRAND宝马520LI
GUIDEPRICE;41.0,PRODUCETIME;'2022-09-01', CARTYPE;'燃油车!
CARNUM100
<!--虽然结果是List集合,但是resultType属性需要指定的是List集合中元素的类型。-->
<select id="selectCarAll" resultType="com.powernode.mybatis.pojo.Car">
<!--记得使用as起别名,让查询结果的字段名和java类的属性名对应上。-->
select
id, car_num as carNum, brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType
from
t_car
</select>
@Test
public void testSelectCarAll(){
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
List<Object> cars = sqlSession.selectList("selectCarAll");
// 输出结果
cars.forEach(car -> System.out.println(car));
}
15:36:48.648
COLUMNS: ID, CARNUM, BRAND, GUIDEPRICE, PRODUCETIME, CARTYPE
TRACE
2022-08-05
CAR.SELECTCARALL
[MAIN]
15:36:48.648 [MAIN] TRACE CA
ROW:1,100,宝马520LI,41.00,2022-09-01,燃油车
2022-08-05
E CAR.SELECTCARALL
ROW: 2,101,奔驰E300L, 54.00, 2022-08-01, 电车
2022-08-05 15:36:48.651 [MAIN] TRACE CAR.SELECTCARALL - < < <
ROW:33,103,奔驰E300L,50.30,2020-10-01,燃油车
2022-08-05 15:36:48.651 [MA]
1 [MAIN] TRACE CAR.SELECTCARALL - <E三
ROW:34,102,比亚迪汉,30.23,2018-09-10,电车
2022-08-05
15:36:48.651 [MAIN] TRACE CAR.SELECTCARALL - <-三
ROW:35,103,奔驰E300L, 50.30,2020-10-01,燃油车
-05 15:36:48.652 [MAIN] TRACE CAR.SELECTCARALL
2022-08-05 1
ROW:36,103,奔驰C200,33.23,2020-10-11, 燃油车
05 15:36:48.653 [MAIN] TRACE CAR.SELECTCARALL
2022-08-05 15:
2022-08-05 15:36:48.654 [MAIN] TRACE CAR.SELECTCARALL -
ROW:37,103,奔驰C200,33.23,2020-10-11,燃油车
TOTAL:7
2022-08-05 15:36:48.654 [MAIN] DEBUG CAR.SELECTCARALL - <E三
CAR(LDEL, CARRUNE'190), BRANDE';宝马520LI', GUIDEPRICO:41.0, PRODOCETIMGETIMG3'2022-99-01', CARTYPE-]]
CARKIDE3, GARNUB三'101', BRANDE;;奔轴E308L', QUIDEPRICE于54.8, PRODUCETIMB三; 2022-98-01', GARTYPE3'电车]]
CAR[LDS33, CANNUNE;103', BRANDE;(70-01', GUIDEPRIGESRIGAS50.3, PRODUCETING三;2028-19-01', CARTYPE三 资油车
CARLIDE34, CARNUM三'102', BRAND三;比亚渡汉', GARTYPEPRIGE-30,23,23, PRADUCETING三;2018-99-10', GARTYPE三(电车
CAR{ID-35, CARNUM三'103', BRAND:'奔驰E300L', GUIDEPRICE-50.3, PR'
CARTYPE燃油车手
E50.3, PRODUCETIME:'2020-10-01',
11',CARTYPE:'燃油车}
CAR[ID三36, CARNUM;'103', BRAND:;察驰C209', QUIDEPRICE-33,23, PRODUCETIME三'2020-10-10-11''
CARFLDE37, CANKUNE'103', BRANDE-78-11', QUIDEPRICES33.23,23, PRODUCETINE三'2920-18-11', CARTYPES'您油车]
<mapper namespace="car2">
<select id="selectCarAll" resultType="com.powernode.mybatis.pojo.Car">
select
id, car_num as carNum, brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType
from
t_car
</select>
</mapper>
<mappers>
<mapper resource="CarMapper.xml"/>
<mapper resource="CarMapper2.xml"/>
</mappers>
@Test
public void testNamespace(){
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
List<Object> cars = sqlSession.selectList("selectCarAll");
// 输出结果
cars.forEach(car -> System.out.println(car));
}
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.IllegalArgumentException:
selectCarAll is ambiguous in Mapped Statements collection (try using the full name including the namespace, or rename one of the entries)
【翻译】selectCarAll在Mapped Statements集合中不明确(请尝试使用包含名称空间的全名,或重命名其中一个条目)
【大致意思是】selectCarAll重名了,你要么在selectCarAll前添加一个名称空间,要有你改个其它名字。
@Test
public void testNamespace(){
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
//List<Object> cars = sqlSession.selectList("car.selectCarAll");
List<Object> cars = sqlSession.selectList("car2.selectCarAll");
// 输出结果
cars.forEach(car -> System.out.println(car));
}
2022-08-05 15:52:27.370 [MAIN]
PREPARING: SELECT ID, CAR-NUM AS CARNUM, BRAND, QUIDE-
CAR.SELECTCARALL
GUIDEP
DEBUG
AS
PRICE
2022-08-05 15:52:27.401 [MAIN]
DEBUG
CAR.SELECTCARALL
PARAMETERS:
中
30 [MAIN]
COLUMNS: ID, CARNUM, BRAND, GUIDEPRICE, PRODUCETIME, CARTYPE
2022-08-05 15:52:27.430 [
CAR.SELECTCARALL
TRACE
2022-08-05 15:52:27.431 [MAIN] TRACE CAR.SELECTCARALL
ROW:1,100,宝马520LI,41.00,20
00,2022-09-01,燃油车
ROW: 2, 101, 奔驰E300L, 54.00, 2022
] TRACE CAR.SELECTCARALL
2022-08-01, 电车
2022-08-05 15:52:27.433 [MAIN] TRAC
2022-08-05 15:52:27.433 [MAIN] TRACE CAR.SELECTCARALL
ROW:33,103,奔驰E300L,50.30,2020-10-01,燃油车
30.23,2018-09-10,电车
TRACE CAR.SELECTCARALL
ROW:34,102,比亚迪汉,30.
2022-08-05 15:52:27.434 [MAIN] TRA
ROW:35,103,奔驰E300L,5
L,50.30,2020-10-01,燃油车
2022-08-05 15:52:27.435 [MAIN] TRA
TRACE CAR.SELECTCARALL
ROW:36,103,奔驰C200,33.23,2020-11,燃油车
2022-08-05 15:52:27.436 [MAIN] TRACE C
E CAR.SELECTCARALL
2022-08-05 15:52:27.436 [MAIN] TRACE CAR.SELECTCARALL -
ROW:37,103,奔驰C200,33.23,2020-11,燃油车
PALL - < <
TOTAL:7
2022-08-05 15:52:27.437 [MAIN] DEBUG CAR.SELECTCARALL - <三
CAR{ID:1, CARNUM三'100', BRAND:'宝马520LI', GUID
(GUIDEPRICE-41.0,PRODUCETIME三'2022-09-01', CARTYPE三'燃油车!
CANFLD三2, CARNUH三'101', BRANDE;;奔驰E3OOL', QUIDEPRICES54.0, PRODUCETIME三;2922-08-01', CARTYPE三'电车]电车]
CAP[LD三33, CARNUNE'103', BRANDE;英施E308L', QUIDEPRICESRICE-50.3, PRODUCETINEE;2020-01', CARTYPE三'燃油车]
CAR(LD:3A, CANNUM三(102', BRAND三 (比亚迪汉', GUIDEPRICO-30,23, PRODUCETINE三'2018-09-10', CARTYPE三'电车]电车]
CAN[LD:35, CARKUME'103', BRANDE"奔驰E3OBL', GUIDEPRICE与50.3, PRODUCETIME三'2920-18-18-91', CARTYPE三'烧油车]
CANFID:36, CANNUHE'103', BRAND三-奔驰C280', GULDEPRICE33,23,23,23, PRODUCETINE三;2028-11', CARTYPES'燃油车]
CANDE37, CARNUBE'103', BRAND三- 29280', GULDEPRICE33, 23,23,23, PRODUCETIME三;2028-11', CARTYPE三'微轴车
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>
<mapper resource="CarMapper2.xml"/>
</mappers>
</configuration>
<configuration>
<!--默认使用开发环境-->
<!--<environments default="dev">-->
<!--默认使用生产环境-->
<environments default="production">
<!--开发环境-->
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<!--生产环境-->
<environment id="production">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
</mapper>
package com.powernode.mybatis;
import com.powernode.mybatis.pojo.Car;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
public class ConfigurationTest {
@Test
public void testEnvironment() throws Exception{
// 准备数据
Car car = new Car();
car.setCarNum("133");
car.setBrand("丰田霸道");
car.setGuidePrice(50.3);
car.setProduceTime("2020-01-10");
car.setCarType("燃油车");
// 一个数据库对应一个SqlSessionFactory对象
// 两个数据库对应两个SqlSessionFactory对象,以此类推
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 使用默认数据库
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession(true);
int count = sqlSession.insert("insertCar", car);
System.out.println("插入了几条记录:" + count);
// 使用指定数据库
SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "dev");
SqlSession sqlSession1 = sqlSessionFactory1.openSession(true);
int count1 = sqlSession1.insert("insertCar", car);
System.out.println("插入了几条记录:" + count1);
}
}
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
[MAIN] DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
2022-08-10
15:42:02.687
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
2022-08-10
[MAIN] DEBUG O.APACHE.IBATIS.DATASOURCE .POOLED.POOLEDDATASOURCE
15:42:02.687
2022-08-10
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
15:42:02.687
[MAIN]
DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
OPENING JDBC CONNECTION
2022-08-10
[MAIN]
15:42:02.758
[MAIN] DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED,POOLEDDATASOURCE
CREATED CONNECTION 2001115307.
2022-08-10 15:42:03.200
2022-08-1015:42:03.205
2022-08-10 15:42:03.245 [
[MAIN] D
] DEBUG CAR.INSERTCAR - <:
2022-08-10 15:42:03.252
UPDATES:1
252[MAIN]D
插入了几条记录:1
[MAIN] DEBUG O.APACHE.IBATIS.DATASOURCE -POOLED.POOLEDDATASOURCE
2022-08-10 15:42:03.263
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
2022-08-10 15:42:03.263
[MAIN] DE
] DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
[MAIN] DEBUG O
2022-08-10 15:42:03.263
H] DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
2022-08-10 15:42:03.272 [MAIN] DEBUG OR
OPENING JDBC CONNECTION
2022-08-10 15:42:03.295 [MAIN] DEBUG
CREATED CONNECTION 1437988306.
H] DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
2022-08-10 15:42:03.295
5 [MAIN] DEBUG CA
2022-08-10 15:42:03.296
2022-08-10 15:42:03.300 [MAIN] DEBUG CAR.INSERTCAR - <三三
UPDATES:1
插入了几条记录:1
对象
IMYBATIS
(LOCALHOST)-表
T_CAR
筛选,三排序导出
目开始事务
00创建图表
数据生成
自文本
ID
BRAND
GUIDE PRICE
CARTYPE
PRODUCE TIME
CAR NUM
丰田霸道
燃油车
50.30/2020-01-10
38133
T_CAR
(LOCALHOST)-表
IPOWERNODE
编辑
帮助
查看
窗口
文件
6导入
目开始事务
筛选.三排序
数据生成0创建图表
导出
文本
ID
BRAND
CAR.TYPE
GUIDE PRICE
CAR NUM
PRODUCE TIME
宝马520LI
燃油车
1100
41.00 2022-09-01
2 101
54.00 2022-08-01
奔驰E300L
电车
燃油车
33 103
奔驰E300L
50.30 2020-10-01
比亚迪汉
30.23 2018-09-10
34 102
电车
奔驰E300L
35 103
燃油车
50.30 2020-10-01
奔驰C200
36 103
燃油车
2020-10-11
33.23 2
燃油车
奔驰C200
37 103
33.23 2020-10-11
丰田霸道
133
燃油车
38
2020-01-10
50.30
<configuration>
<environments default="dev">
<environment id="dev">
<transactionManager type="MANAGED"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
@Test
public void testTransactionManager() throws Exception{
// 准备数据
Car car = new Car();
car.setCarNum("133");
car.setBrand("丰田霸道");
car.setGuidePrice(50.3);
car.setProduceTime("2020-01-10");
car.setCarType("燃油车");
// 获取SqlSessionFactory对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config2.xml"));
// 获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行SQL
int count = sqlSession.insert("insertCar", car);
System.out.println("插入了几条记录:" + count);
}
<configuration>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
@Test
public void testDataSource() throws Exception{
// 准备数据
Car car = new Car();
car.setCarNum("133");
car.setBrand("丰田霸道");
car.setGuidePrice(50.3);
car.setProduceTime("2020-01-10");
car.setCarType("燃油车");
// 获取SqlSessionFactory对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config3.xml"));
// 获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 执行SQL
int count = sqlSession.insert("insertCar", car);
System.out.println("插入了几条记录:" + count);
// 关闭会话
sqlSession.close();
}
TESTS PASSED:1 OF 1 TEST -843 MS
C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE .
2022-08-10 17:57:26.619 [
9 (MAIN) DEBUG ORG-APACHE,IBATIS,TRANSACTION-JDBC,JDBCTRANSACTRANSACTION -LOPENING JDECTIONNECTION
2022-08-10 17:57:27.050
2822-08-10 17:57:27.892 [MAIN] DEBUG CAR.INSERTGAR - <E; UPDATES: 1
插入了几条记录:1
CLOSING JDBC CONNECTION[COM.MYSQL.CJ.JDBC.CONNECTIONIMPL@6B9CE1BF]
2022-08-10 17:57:27.895 [MAIN] DEBUG ORG.APACHE.IBATIS,TRANSACTION.JDBC.JDBCTRANSACTION
<dataSource type="POOLED">
TESTS PASSED:1 OF 1 TEST -880MS
C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE .
2022-08-10 18:00:40.948
2022-08-10 18:09:41.010 (MAIN) DEBUG ORG.APACHE.IBATIS.TRANSACTION-JDBC.JDBC.JDBCTRANSACTION
OPENING JDBC CONNECTION
CREATED CONNECTION 2001115307.
2022-08-10 18:99:41.450 [MAIN] DEBUG O.APACHE,LBATIS.DATASOURCE.POOLED.POOLED.POOLEDDATASOURCE
2022-08-10 18:00:41.489 [MAIN] DEBUG CAR.INSERTCAR - <三三
UPDATES:1
插入了几条记录:1
[COM.MYSQL.CJ.JDBC.CONNECTIONIMPLQ774698AB]
2022-08-10 18:09:41.492 [MAIN] DEBUG ORG.APACHE,IBATIS.TRANSACTION-JABC.JDBCTRANSACTION
CLOSING JDBC CONNECTION
RETURNED CONNECTION 2001115307 TO POOL,
2022-08-10 18:90:41.493 (MAIN] DEBUG O-APACHE.IBATIS,DATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
<dataSource type="JNDI">
<configuration>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<!--最大连接数-->
<property name="poolMaximumActiveConnections" value="3"/>
<!--这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直失败且不打印日志),默认值:20000 毫秒(即 20 秒)。-->
<property name="poolTimeToWait" value="20000"/>
<!--强行回归池的时间-->
<property name="poolMaximumCheckoutTime" value="20000"/>
<!--最多空闲数量-->
<property name="poolMaximumIdleConnections" value="1"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
(ENTER) OR ADD A WATCH (CTRL+SHIFT+ENTER)
EVALUATE EXPRESSION
"DEV"
TRANSACTIONFACTORY - {JDBCTRANSACTIONFACTORY@2657)
DATASOURCE - {POOLEDDATASOURCE@2658}
I STATE - (POOLSTATE@2659)"\N::CONFIGURATION::
F DATASOURCE {UNPOOLEDDATASOURCE@2660]
POOLMAXIMUMACTIVECONNECTIONS - 10
I POOLMAXIMUMLDLECONNECTIONS 5
F POOLMAXIMUMCHECKOUTTIME - 2000
I POOLTIMETOWAIT2000
POOLMAXIMUMLOCALBADCONNECTIONTOLERANCE - 3
POOLPINGQUERY - "NO PING QUERY SET"
POOLPINGENABLEDFALSE
POOLPINGCONNECTIONSNOTUSEDFOR - 0
EXPECTEDCONNECTIONTYPECODE - 1966334464
SAFEROWBOUNDSENABLED FALSE
@Test
public void testPool() throws Exception{
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config3.xml"));
for (int i = 0; i < 4; i++) {
SqlSession sqlSession = sqlSessionFactory.openSession();
Object selectCarByCarNum = sqlSession.selectOne("selectCarByCarNum");
}
}
<select id="selectCarByCarNum" resultType="com.powernode.mybatis.pojo.Car">
select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car where car_num = '100'
</select>
TESTS PASSED:1 TEST - 40 SEC 964MS
4MS
2922-08-10 18:39:32.453 (MAIN] DEBUG ORG.APACHE-IBATIS.TRANSACTION-JDBC.JDBC.JDBCTRANSACTION
OPENING JDBC CONNECTION
2022-08-10 18:39:32.867 [MAIN] DEBUG O-APACHE.IBATIS,DATIS,DATASOURCE-POOLED.POOLEDDATASOURCO
CREATED CONNECTION 1540894701.
2022-08-19 18:39:32.867 (MAIN) DEBUG ORG-APACHE-IBATIS.TRANSACTION-JDBC.JDBC.JDBCTRANSACTION
[COM.MYSQ]
SETTING AUTOCOMMIT TO FALSE ON JDBC
CONNECTION
NERIS CAP-SELECTCARAYBANTUN - STE PREPARTNG; SELECT ID.GAR-NUN CANLUN CANLUM-AUIDO-ANICE GUTDERNICE
2022-08-10 18:39:32.871 [MAIN] DEBUG C
RICE,PRODUCE_TIME PRO
2022-08-10 18:39:32.900 [
[MAIN]
] DEBUG CAR.SELECTCARBYCARNUM - E三> PARAMETERS:
TOTAL: 1
DEBUG CAR.SELECTCARBYCARNUM - <EE
2022-08-10 18:39:32.933 [MAIN]
[MAIN] DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
2022-08-10 18:39:32.935
OPENING JDBC CONNECTION
2022-08-10 18:39:32.958 [MAIN]
CREATED CONNECTION 1445424568.
DEBUG
O.APACHE.IBATIS.DATASOURCE,POOLED,POOLEDDATASOURCE
2022-08-10 18:39:32.959 [MAIN]
DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
SETTING AUTOCOMMIT TO FALSE ON JDBC CONNECTION (COM.MYSQ
DEBUG CAR.SELECTCARBYCARNUM - EE> PRE
PREPARING: SELECT ID,CAR-NUM CARNUM,BRAND,GUIDE-PRICE GUIDEPRICE,PRODUCE-TIME PR
2022-08-10 18:39:32.960 [MAIN]
0 [MAIN] DEBUG CAR.SELECTCARBYCARNUM - -
10 18:39:32.960
2022-08-10
- E> PAPAMETEPS:
TOTAL: 1
2022-08-10 18:39:32.962 [MAIN] DEBUG CAR.SELECTCARBYCARNUM - <
[MAIN] DEBU
] DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
2022-08-10 18:39:32.962
OPENING JDBC CONNECTION
2022-08-10 18:39:32.980 [MAIN] DEBUS O-APACHE.IHATIS.DATASOURCE-POOLED.POOLEDDATASOUNCE
CREATED CONNECTION 767511741.
S ORG.APACHE. BATIS.TRANSACTION-JDBC.JDBCTRANSACTION - SETTING AUTOCOMMIT TO FALSE ON JDBC CONNECTIO
2022-08-10 18:39:32.980 [MAIN] DEBUG O
[COM.MYSQ
2022-08-10 18:39:32.980 [MAIN] DEBUG CAR.SELECTCARBYCARNUM
PREPARING: SELECT ID.CAR-NUM CANNUM,BRAND,QUIDE-PRICE QUIDEPRICE,PRODUCE-TIMG
LEPRO
2022-08-10 18:39:32.981 [MAIN] DEBUG CAR.SELECTCARBYCARNUM
PARAMETERS
TOTAL: 1
2022-08-10 18:39:32.982 [MAIN] DEBUG CAR.SELECTCARBYCARNUM - <三三
2022-08-10 18:39:32.982 [M
182 [MAIN] DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
OPENING JDBC CONNECTION
WAITING AS LONG AS 20000 MILLISECONDS FOR CONNECTION.
2022-08-10 18:39:32.982 [MAIN] D
] DEBUG O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
2022-08-10 18:39:52.985 [MAIN] DEBUG O
WAITING AS LONG AS 20000 MILLISECONDS FOR CONNECTION.
G O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
2022-08-10 18:40:12.992
CLAIMED OVERDUE CONNECTION 1540894701.
DEBUG
[MAIN]
O.APACHE.IBATIS.DATASOURCE.POOLED.POOLEDDATASOURCE
2022-08-10 18:40:12.994 [MAIN]
DEBUG CAR.SELECTCARBYCARNUM
PRENARING: SELECT ID,GAR-NUM CARNUM,BRAND,QUIDE-PRICE QUIDEPRICE,PRODUCE-TIME PRIME PRAND,QUIDE,PRICE
2022-08-10 18:40:12.996 [MAIN] DE
INL DEBUG CAR.SELECTCARBYCARNUM -
PARAMETERS
2022-08-10 18:40:13.002 [MAIN] DEBUG CAR.SELECTCARBYCARNUM
TOTAL: 1
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/powernode
<configuration>
<!--引入外部属性资源文件-->
<properties resource="jdbc.properties">
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--${key}使用-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
@Test
public void testProperties() throws Exception{
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config4.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
Object car = sqlSession.selectOne("selectCarByCarNum");
System.out.println(car);
}
<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>
<mappers>
<mapper resource="test/CarMapper.xml"/>
</mappers>
<mappers>
<mapper url="file:///d:/CarMapper.xml"/>
</mappers>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.group</groupId>
<artifactId>parse-xml-by-dom4j</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!--dom4j依赖-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!--jaxen依赖-->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
<!--junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
</project>
<configuration>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<mappers>
<mapper resource="sqlmapper.xml"/>
</mappers>
</environments>
</configuration>
package com.powernode.dom4j;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 使用dom4j解析XML文件
*/
public class ParseXMLByDom4j {
@Test
public void testGodBatisConfig() throws Exception{
// 读取xml,获取document对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("godbatis-config.xml"));
// 获取<environments>标签的default属性的值
Element environmentsElt = (Element)document.selectSingleNode("/configuration/environments");
String defaultId = environmentsElt.attributeValue("default");
System.out.println(defaultId);
// 获取environment标签
Element environmentElt = (Element)document.selectSingleNode("/configuration/environments/environment[@id='" + defaultId + "']");
// 获取事务管理器类型
Element transactionManager = environmentElt.element("transactionManager");
String transactionManagerType = transactionManager.attributeValue("type");
System.out.println(transactionManagerType);
// 获取数据源类型
Element dataSource = environmentElt.element("dataSource");
String dataSourceType = dataSource.attributeValue("type");
System.out.println(dataSourceType);
// 将数据源信息封装到Map集合
Map<String,String> dataSourceMap = new HashMap<>();
dataSource.elements().forEach(propertyElt -> {
dataSourceMap.put(propertyElt.attributeValue("name"), propertyElt.attributeValue("value"));
});
dataSourceMap.forEach((k, v) -> System.out.println(k + ":" + v));
// 获取sqlmapper.xml文件的路径
Element mappersElt = (Element) document.selectSingleNode("/configuration/environments/mappers");
mappersElt.elements().forEach(mapper -> {
System.out.println(mapper.attributeValue("resource"));
});
}
}
DEV
JDBC
POOLED
PASSWORD:ROOT
DRIVER:COM.MYSQL.CJ.JDBC.DRIVER
URL:JDBC:MYSQL://LOCALHOST:3306/POWERNODE
USERNAME:ROOT
SQLMAPPER. XML
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
<select id="selectCarByCarNum" resultType="com.powernode.mybatis.pojo.Car">
select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car where car_num = #{carNum}
</select>
</mapper>
@Test
public void testSqlMapper() throws Exception{
// 读取xml,获取document对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("sqlmapper.xml"));
// 获取namespace
Element mapperElt = (Element) document.selectSingleNode("/mapper");
String namespace = mapperElt.attributeValue("namespace");
System.out.println(namespace);
// 获取sql id
mapperElt.elements().forEach(statementElt -> {
// 标签名
String name = statementElt.getName();
System.out.println("name:" + name);
// 如果是select标签,还要获取它的resultType
if ("select".equals(name)) {
String resultType = statementElt.attributeValue("resultType");
System.out.println("resultType:" + resultType);
}
// sql id
String id = statementElt.attributeValue("id");
System.out.println("sqlId:" + id);
// sql语句
String sql = statementElt.getTextTrim();
System.out.println("sql:" + sql);
});
}
CAR
NAME:INSERT
SGLID:INSERTCAR
NAME:SELECT
RESULTTYPE:COM.POWERNODE.MYBATIS.POJO.CAR
SQLID:SELECTCARBYCARNUM
@Test
public void testInsert(){
SqlSession sqlSession = null;
try {
// 1.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2.创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 3.创建SqlSession对象
sqlSession = sqlSessionFactory.openSession();
// 4.执行SQL
Car car = new Car(null, "111", "宝马X7", "70.3", "2010-10-11", "燃油车");
int count = sqlSession.insert("insertCar",car);
System.out.println("更新了几条记录:" + count);
// 5.提交
sqlSession.commit();
} catch (Exception e) {
// 回滚
if (sqlSession != null) {
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 6.关闭
if (sqlSession != null) {
sqlSession.close();
}
}
}
@Test
public void testSelectOne(){
SqlSession sqlSession = null;
try {
// 1.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2.创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 3.创建SqlSession对象
sqlSession = sqlSessionFactory.openSession();
// 4.执行SQL
Car car = (Car)sqlSession.selectOne("selectCarByCarNum", "111");
System.out.println(car);
// 5.提交
sqlSession.commit();
} catch (Exception e) {
// 回滚
if (sqlSession != null) {
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 6.关闭
if (sqlSession != null) {
sqlSession.close();
}
}
}
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.god</groupId>
<artifactId>godbatis</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<dependencies>
<!--dom4j依赖-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!--jaxen依赖-->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
<!--junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
</project>
package org.god.core;
import java.io.InputStream;
/**
* 资源工具类
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class Resources {
/**
* 从类路径中获取配置文件的输入流
* @param config
* @return 输入流,该输入流指向类路径中的配置文件
*/
public static InputStream getResourcesAsStream(String config){
return Thread.currentThread().getContextClassLoader().getResourceAsStream(config);
}
}
package org.god.core;
import java.io.InputStream;
/**
* SqlSessionFactory对象构建器
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class SqlSessionFactoryBuilder {
/**
* 创建构建器对象
*/
public SqlSessionFactoryBuilder() {
}
/**
* 获取SqlSessionFactory对象
* 该方法主要功能是:读取godbatis核心配置文件,并构建SqlSessionFactory对象
* @param inputStream 指向核心配置文件的输入流
* @return SqlSessionFactory对象
*/
public SqlSessionFactory build(InputStream inputStream){
// 解析配置文件,创建数据源对象
// 解析配置文件,创建事务管理器对象
// 解析配置文件,获取所有的SQL映射对象
// 将以上信息封装到SqlSessionFactory对象中
// 返回
return null;
}
}
package org.god.core;
import java.sql.Connection;
/**
* 事务管理器接口
* @author 老杜
* @version 1.0
* @since 1.0
*/
public interface TransactionManager {
/**
* 提交事务
*/
void commit();
/**
* 回滚事务
*/
void rollback();
/**
* 关闭事务
*/
void close();
/**
* 开启连接
*/
void openConnection();
/**
* 获取连接对象
* @return 连接对象
*/
Connection getConnection();
}
package org.god.core;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* 事务管理器
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class GodJDBCTransaction implements TransactionManager {
/**
* 连接对象,控制事务时需要
*/
private Connection conn;
/**
* 数据源对象
*/
private DataSource dataSource;
/**
* 自动提交标志:
* true表示自动提交
* false表示不自动提交
*/
private boolean autoCommit;
/**
* 构造事务管理器对象
* @param autoCommit
*/
public GodJDBCTransaction(DataSource dataSource, boolean autoCommit) {
this.dataSource = dataSource;
this.autoCommit = autoCommit;
}
/**
* 提交事务
*/
public void commit(){
try {
conn.commit();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 回滚事务
*/
public void rollback(){
try {
conn.rollback();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public void close() {
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public void openConnection() {
try {
this.conn = dataSource.getConnection();
this.conn.setAutoCommit(this.autoCommit);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public Connection getConnection() {
return conn;
}
}
package org.god.core;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
/**
* 数据源实现类,不使用连接池
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class GodUNPOOLEDDataSource implements javax.sql.DataSource{
private String url;
private String username;
private String password;
public GodUNPOOLEDDataSource(String driver, String url, String username, String password) {
try {
// 注册驱动
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
this.url = url;
this.username = username;
this.password = password;
}
@Override
public Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
}
package org.god.core;
/**
* SQL映射实体类
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class GodMappedStatement {
private String sqlId;
private String resultType;
private String sql;
private String parameterType;
private String sqlType;
@Override
public String toString() {
return "GodMappedStatement{" +
"sqlId='" + sqlId + '\'' +
", resultType='" + resultType + '\'' +
", sql='" + sql + '\'' +
", parameterType='" + parameterType + '\'' +
", sqlType='" + sqlType + '\'' +
'}';
}
public String getSqlId() {
return sqlId;
}
public void setSqlId(String sqlId) {
this.sqlId = sqlId;
}
public String getResultType() {
return resultType;
}
public void setResultType(String resultType) {
this.resultType = resultType;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public String getParameterType() {
return parameterType;
}
public void setParameterType(String parameterType) {
this.parameterType = parameterType;
}
public String getSqlType() {
return sqlType;
}
public void setSqlType(String sqlType) {
this.sqlType = sqlType;
}
public GodMappedStatement(String sqlId, String resultType, String sql, String parameterType, String sqlType) {
this.sqlId = sqlId;
this.resultType = resultType;
this.sql = sql;
this.parameterType = parameterType;
this.sqlType = sqlType;
}
}
package org.god.core;
import javax.sql.DataSource;
import java.util.List;
import java.util.Map;
/**
* SqlSession工厂对象,使用SqlSessionFactory可以获取会话对象
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class SqlSessionFactory {
private TransactionManager transactionManager;
private Map<String, GodMappedStatement> mappedStatements;
public SqlSessionFactory(TransactionManager transactionManager, Map<String, GodMappedStatement> mappedStatements) {
this.transactionManager = transactionManager;
this.mappedStatements = mappedStatements;
}
public TransactionManager getTransactionManager() {
return transactionManager;
}
public void setTransactionManager(TransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public Map<String, GodMappedStatement> getMappedStatements() {
return mappedStatements;
}
public void setMappedStatements(Map<String, GodMappedStatement> mappedStatements) {
this.mappedStatements = mappedStatements;
}
}
package org.god.core;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import javax.sql.DataSource;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* SqlSessionFactory对象构建器
*
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class SqlSessionFactoryBuilder {
/**
* 创建构建器对象
*/
public SqlSessionFactoryBuilder() {
}
/**
* 获取SqlSessionFactory对象
* 该方法主要功能是:读取godbatis核心配置文件,并构建SqlSessionFactory对象
*
* @param inputStream 指向核心配置文件的输入流
* @return SqlSessionFactory对象
*/
public SqlSessionFactory build(InputStream inputStream) throws DocumentException {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputStream);
Element environmentsElt = (Element) document.selectSingleNode("/configuration/environments");
String defaultEnv = environmentsElt.attributeValue("default");
Element environmentElt = (Element) document.selectSingleNode("/configuration/environments/environment[@id='" + defaultEnv + "']");
// 解析配置文件,创建数据源对象
Element dataSourceElt = environmentElt.element("dataSource");
DataSource dataSource = getDataSource(dataSourceElt);
// 解析配置文件,创建事务管理器对象
Element transactionManagerElt = environmentElt.element("transactionManager");
TransactionManager transactionManager = getTransactionManager(transactionManagerElt, dataSource);
// 解析配置文件,获取所有的SQL映射对象
Element mappers = environmentsElt.element("mappers");
Map<String, GodMappedStatement> mappedStatements = getMappedStatements(mappers);
// 将以上信息封装到SqlSessionFactory对象中
SqlSessionFactory sqlSessionFactory = new SqlSessionFactory(transactionManager, mappedStatements);
// 返回
return sqlSessionFactory;
}
private Map<String, GodMappedStatement> getMappedStatements(Element mappers) {
Map<String, GodMappedStatement> mappedStatements = new HashMap<>();
mappers.elements().forEach(mapperElt -> {
try {
String resource = mapperElt.attributeValue("resource");
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(Resources.getResourcesAsStream(resource));
Element mapper = (Element) document.selectSingleNode("/mapper");
String namespace = mapper.attributeValue("namespace");
mapper.elements().forEach(sqlMapper -> {
String sqlId = sqlMapper.attributeValue("id");
String sql = sqlMapper.getTextTrim();
String parameterType = sqlMapper.attributeValue("parameterType");
String resultType = sqlMapper.attributeValue("resultType");
String sqlType = sqlMapper.getName().toLowerCase();
// 封装GodMappedStatement对象
GodMappedStatement godMappedStatement = new GodMappedStatement(sqlId, resultType, sql, parameterType, sqlType);
mappedStatements.put(namespace + "." + sqlId, godMappedStatement);
});
} catch (DocumentException e) {
throw new RuntimeException(e);
}
});
return mappedStatements;
}
private TransactionManager getTransactionManager(Element transactionManagerElt, DataSource dataSource) {
String type = transactionManagerElt.attributeValue("type").toUpperCase();
TransactionManager transactionManager = null;
if ("JDBC".equals(type)) {
// 使用JDBC事务
transactionManager = new GodJDBCTransaction(dataSource, false);
} else if ("MANAGED".equals(type)) {
// 事务管理器是交给JEE容器的
}
return transactionManager;
}
private DataSource getDataSource(Element dataSourceElt) {
// 获取所有数据源的属性配置
Map<String, String> dataSourceMap = new HashMap<>();
dataSourceElt.elements().forEach(propertyElt -> {
dataSourceMap.put(propertyElt.attributeValue("name"), propertyElt.attributeValue("value"));
});
String dataSourceType = dataSourceElt.attributeValue("type").toUpperCase();
DataSource dataSource = null;
if ("POOLED".equals(dataSourceType)) {
} else if ("UNPOOLED".equals(dataSourceType)) {
dataSource = new GodUNPOOLEDDataSource(dataSourceMap.get("driver"), dataSourceMap.get("url"), dataSourceMap.get("username"), dataSourceMap.get("password"));
} else if ("JNDI".equals(dataSourceType)) {
}
return dataSource;
}
}
public SqlSession openSession(){
transactionManager.openConnection();
SqlSession sqlSession = new SqlSession(transactionManager, mappedStatements);
return sqlSession;
}
package org.god.core;
import java.sql.SQLException;
import java.util.Map;
/**
* 数据库会话对象
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class SqlSession {
private TransactionManager transactionManager;
private Map<String, GodMappedStatement> mappedStatements;
public SqlSession(TransactionManager transactionManager, Map<String, GodMappedStatement> mappedStatements) {
this.transactionManager = transactionManager;
this.mappedStatements = mappedStatements;
}
public void commit(){
try {
transactionManager.getConnection().commit();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void rollback(){
try {
transactionManager.getConnection().rollback();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void close(){
try {
transactionManager.getConnection().close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
/**
* 插入数据
*
* @param sqlId 要执行的sqlId
* @param obj 插入的数据
* @return
*/
public int insert(String sqlId, Object obj) {
GodMappedStatement godMappedStatement = mappedStatements.get(sqlId);
Connection connection = transactionManager.getConnection();
// 获取sql语句
// insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
String godbatisSql = godMappedStatement.getSql();
// insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,?,?,?,?,?)
String sql = godbatisSql.replaceAll("#\\{[a-zA-Z0-9_\\$]*}", "?");
// 重点一步
Map<Integer, String> map = new HashMap<>();
int index = 1;
while (godbatisSql.indexOf("#") >= 0) {
int beginIndex = godbatisSql.indexOf("#") + 2;
int endIndex = godbatisSql.indexOf("}");
map.put(index++, godbatisSql.substring(beginIndex, endIndex).trim());
godbatisSql = godbatisSql.substring(endIndex + 1);
}
final PreparedStatement ps;
try {
ps = connection.prepareStatement(sql);
// 给?赋值
map.forEach((k, v) -> {
try {
// 获取java实体类的get方法名
String getMethodName = "get" + v.toUpperCase().charAt(0) + v.substring(1);
Method getMethod = obj.getClass().getDeclaredMethod(getMethodName);
ps.setString(k, getMethod.invoke(obj).toString());
} catch (Exception e) {
throw new RuntimeException(e);
}
});
int count = ps.executeUpdate();
ps.close();
return count;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 查询一个对象
* @param sqlId
* @param parameterObj
* @return
*/
public Object selectOne(String sqlId, Object parameterObj){
GodMappedStatement godMappedStatement = mappedStatements.get(sqlId);
Connection connection = transactionManager.getConnection();
// 获取sql语句
String godbatisSql = godMappedStatement.getSql();
String sql = godbatisSql.replaceAll("#\\{[a-zA-Z0-9_\\$]*}", "?");
// 执行sql
PreparedStatement ps = null;
ResultSet rs = null;
Object obj = null;
try {
ps = connection.prepareStatement(sql);
ps.setString(1, parameterObj.toString());
rs = ps.executeQuery();
if (rs.next()) {
// 将结果集封装对象,通过反射
String resultType = godMappedStatement.getResultType();
Class<?> aClass = Class.forName(resultType);
Constructor<?> con = aClass.getDeclaredConstructor();
obj = con.newInstance();
// 给对象obj属性赋值
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
String columnName = rsmd.getColumnName(i);
String setMethodName = "set" + columnName.toUpperCase().charAt(0) + columnName.substring(1);
Method setMethod = aClass.getDeclaredMethod(setMethodName, aClass.getDeclaredField(columnName).getType());
setMethod.invoke(obj, rs.getString(columnName));
}
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
try {
ps.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return obj;
}
MAVEN
ME0云0五K
IMGODBATIS
LIFECYCLE
女 CLEAN
U VALIDATE
COMPILE
TEST
PACKAGE
VERIFY
INSTALL
SITE
DEPLOY
PLUGINS
> INDEPENDENCIES
MYBATIS-001-INTRODUCTION
>
MYBATIS-002-CRUD
MYBATIS-003-CONFIGURATION
MPARSE-XML-BY-DOM4J
文档(E:) > REPOSITORY > ORG > GOD > GODBATIS > 1.0.0
类型
修改日期
名称
REPOSITOR
REMOTE.REPOSITORIES
2022/8/11 16:24
EXECUTABLE
2022/8/11 16:24
GODBATIS-1.0.0.JAR
POM文件
2022/8/1110:36
GODBATIS-1.0.0.POM
对象
T_USER@POWERNODE(LOCALHOST)-表
下移
个 上移
插入字段
添加字段
主键
保存
字段
索引
注释
检查
外键
SQL预览
选项
触发器
不是NULL
类型
长度
小数点
虚拟
注释
名
键
ID
255
VARCHAR
255
VARCHAR
NAME
255
VARCHAR
EMAIL
ADDRESS
255
VARCHAR
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.powernode</groupId>
<artifactId>godbatis-test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!--godbatis依赖-->
<dependency>
<groupId>org.god</groupId>
<artifactId>godbatis</artifactId>
<version>1.0.0</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
</project>
package com.powernode.godbatis.pojo;
public class User {
private String id;
private String name;
private String email;
private String address;
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", email='" + email + '\'' +
", address='" + address + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public User() {
}
public User(String id, String name, String email, String address) {
this.id = id;
this.name = name;
this.email = email;
this.address = address;
}
}
<configuration>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</environments>
</configuration>
<mapper namespace="user">
<insert id="insertUser">
insert into t_user(id,name,email,address) values(#{id},#{name},#{email},#{address})
</insert>
<select id="selectUserById" resultType="com.powernode.godbatis.pojo.User">
select * from t_user where id = #{id}
</select>
</mapper>
package com.powernode.godbatis.test;
import com.powernode.godbatis.pojo.User;
import org.god.core.Resources;
import org.god.core.SqlSession;
import org.god.core.SqlSessionFactory;
import org.god.core.SqlSessionFactoryBuilder;
import org.junit.Test;
public class GodBatisTest {
@Test
public void testInsertUser() throws Exception{
User user = new User("1", "zhangsan", "zhangsan@1234.com", "北京大兴区");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourcesAsStream("godbatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
int count = sqlSession.insert("user.insertUser", user);
System.out.println("插入了几条记录:" + count);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testSelectUserById() throws Exception{
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourcesAsStream("godbatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
Object user = sqlSession.selectOne("user.selectUserById", "1");
System.out.println(user);
sqlSession.close();
}
}
TESTS PASSED:1 OF 1 TEST -627MS
C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE
插入了几条记录:1
FINISHED WITH EXIT CODE
PROCESS
对象
USER@POWERNODE(LOCALHOST)-表
月开始事务
[6导入
导出
数据生
自文本?筛选,三排序
IP
ADDRESS
EMAIL
NAME
ZHANGSAN@北京大兴区
ZHANGSAN
TESTS PASSED:1 OF1 TEST -645MS
C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE
USERFIDE'1',NAME三'ZHANGSAN',EMAIL-'ZHANGSANGSAN01234.COM', ADDRESS-'北京大兴区"
PROCESS FINISHED WITH EXIT CODE 0
<mapper namespace="user">
<insert id="insertUser">
insert into t_user(id,name,email,address) values(#{id},#{name},#{email},#{address})
</insert>
<select id="selectUserById" resultType="com.powernode.godbatis.pojo.User">
select id,name,email,address from t_user where id = #{id}
</select>
</mapper>
银行账户转账
C://USERS/ADMINISTRATOR/DESKTOP/INDEX.HTML
文件
转出账户:
ACT001
转入账户:
ACT002
转账金额:
10000
转账
对象
T_ACT@POWERNODE(LOCALHOST)-表
个 上移
日保存
下移
删除字段
插入字段
添加字段
主键
字段
SQL预览
注释
选项
索引
检查
触发器
外键
类型
名
键
不是NULL
虚拟
注释
长度
小数点
BIGINT
单纯的主键,自增
ID
账号
VARCHAR
255
ACTNO
2
DECIMAL
BALANCE
余额
15
对象
T ACT@POWERNODE(LOCALHOST) -表
自文本?筛选,三排序
目开始事务
6导入口导
导出
00创建
数据生成
BALANCE
ACTNO
50000.00
ACT001
0.00
ACT002
NEW MODULE
TO CREATE A QENERAL MAVEN MODULE,GO TO THE NEW MODULE PAGE.
NEW MODULE
MYBATIS-004-WEB
NAME:
GENERATORS
M MAVEN ARCHETYPE
D:\POWERNODE\MYBATIS\CODE\MYBATIS
LOCATION:
JAVA ENTERPRISE
MODULE WILL BE CREATED IN:D:/POWERNODE(MYBATIS/CODE(MYBATIS(MYBATIS-004-WEB
SPRING INITIALIZR
CREATE GIT REPOSITORY
JAVAFX
JDK:
PROJECT SDK 17
QUARKUS
MICRONAUT
<NONE>
PARENT:
KTOR
MANAGE CATALOGS...
CATALOG:
INTERNA
COMPOSE MULTIPLATFORM
HTML
ADD...
ARCHETYPE:
ORG.APACHE.MAVEN.ARCHETYPES:MAVEN-ARCHETYPE-WEBAPP
REACT
VERSION:
RELEASE
EX EXPRESS
A ANGULAR CLI
ADDITIONAL PROPERTIES
IDE PLUGIN
ANDROID
NO PROPERTIES
ADVANCED SETTINGS
GROUPLD
COM.POWERNODE
ARTIFACTLD:
MYBATIS-004-WEB
VERSION:
1.O-SNAPSHOT
CANCEL
CREATE
RUN/DEBUG CONFIGURATIONS
计划目
J STORE AS PROJECT FILE A
NAME:
TOMCAT 10.23
JUNIT
TOMCAT SERVER
TOMCAT 10.0.23
LOGS CODE COVERAGE
STARTUP/CONNECTION
DEPLOYMENT
SERVER
CONFIGURE...
APPLICATION SERVER:
TOMCAT 10.0.23
OPEN BROWSER
J WITH JAVASCRIPT DEBUGGER
AFTER LAUNCH
CHROME
HTTP://LOCALHOST:8080/BANK/
URL:
VM OPTIONS:
ON'UPDATE'ACTION:
SHOW DIALOG
UPDATE CLASSES AND RESOURCES
ON FRAME DEACTIVATION:
UPDATE CLASSES AND RESOURCES
17
JRE:
TOMCAT SERVER SETTINGS
DEPLOY APPLICATIONS CONFIGURED IN TOMCAT INSTANCE
HTTP PORT:
8080
PRESERVE SESSIONS ACROSS RESTARTS AND REDEPLOYS
HTTPS PORT:
JMX PORT:
1099
AJP PORT:
BEFORE LAUNCH
BUILD
BUILD 'MYBATIS-004-WEB:WAR EXPLODED' ARTIFACT
EDIT CONFIGURATION TEMPLATES...
OK
APPLY
CANCEL
RUN/DEBUG CONFIGURATIONS
计划目
TOMCAT 10.0.23
NAME:
STORE AS PROJECT FILE
JUNIT
TOMCAT SERVER
TOMCAT 10.0.23
CODE COVERAGE
DEPLOYMENT
STARTUP/CONNECTION
LOGS
SERVER
DEPLOY AT THE SERVER STARTUP
MYBATIS-004-WEB:WAR EXPLODED
PLICATION CONTEXT://BANK
BEFORE LAUNCH
BUILD
BUILD 'MYBATIS-004-WEB:WAR EXPLODED' ARTIFACT
EDIT CONFIGURATION TEMPLATES...
OK
CANCEL
APPLY
PROJECT
MYBATIS D:\POWERNODE\MYBATIS/CODE\MYL
.IDEA
GODBATIS
GODBATIS-TEST
MYBATIS-001-INTRODUCTION
MYBATIS-002-CRUD
MYBATIS-003-CONFIGURATION
MYBATIS-004-WEB
SRC
MAIN
LAVA
RESOURCES
WEBAPP
WEB-INF
INDEXJSP
POM.XML
PARSE-XML-BY-DOM4J
1. MYBATIS.IML
LI EXTERNAL LIBRARIES
SCRATCHES AND CONSOLES
文档(E:) REPOSITORY >ORG > AP
1.4
APACHE>MAVEN>ARCHETYPES>MAVEN-ARCHETYPE-WEBAPP
类型
名称
修改日期
大小
REPOSITORIES ...
1 KB
2022/8/1211:39
REMOTE.REPOSITORIES
8 KB
MAVEN-ARCHETYPE-WEBAPP-1.4JAR
2022/8/1217:38
EXECUTABLE JAR FILE
1 KB
SHA1文件
2022/8/12 11:39
MAVEN-ARCHETYPE-WEBAPP-1.4.JAR.SHAL
POM文件
2022/8/1211:39
2KB
MAVEN-ARCHETYPE-WEBAPP-1.4.POM
SHA1文件
1 KB
2022/8/1211:39
MAVEN-ARCHETYPE-WEBAPP-1.4.POM.S...
操作
设置
文件
MAVEN-ARCHETYPE-WEBAP..-360压缩
NEW
工具
添加
解压到
图片压缩
一键解压
删除
解包大小为15.4KB
MAVEN-ARCHETYPE-WEBAPP-1.4JAR
META-INFMAVEN
类型
压缩前
压缩后
修改日期
名称
文件夹
(上级目录)
1 KB
2022-08-12 17:38
1.4 KB
ARCHETYPE-METADATA.XML
XML文档
<FILESETS>
日
<FILESET>
日
DIRECTORYSRC/MAIN/JAVA</DIRECTORY>
</FILESET>
<FILESET>
<DIRECTORY>SRC/MAIN/RESOURCES</DIRECTORY>
/FILESET>
<FILESET>
<DIRECTORY SRC/MAIN/WEBAPP</DIRECTORY>
</FILESET>
</FILESETS>
</ARCHETYPE-DESCRIPTOR>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0"
metadata-complete="true">
</web-app>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.powernode</groupId>
<artifactId>mybatis-004-web</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>mybatis-004-web</name>
<url>http://localhost:8080/bank</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!--junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--logback依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<!--servlet依赖-->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>mybatis-004-web</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/powernode
jdbc.username=root
jdbc.password=root
<configuration>
<properties resource="jdbc.properties"/>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--一定要注意这里的路径哦!!!-->
<mapper resource="AccountMapper.xml"/>
</mappers>
</configuration>
<mapper namespace="account">
</mapper>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>银行账户转账</title>
</head>
<body>
<!--/bank是应用的根,部署web应用到tomcat的时候一定要注意这个名字-->
<form action="/bank/transfer" method="post">
转出账户:<input type="text" name="fromActno"/><br>
转入账户:<input type="text" name="toActno"/><br>
转账金额:<input type="text" name="money"/><br>
<input type="submit" value="转账"/>
</form>
</body>
</html>
package com.powernode.bank.pojo;
/**
* 银行账户类
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class Account {
private Long id;
private String actno;
private Double balance;
@Override
public String toString() {
return "Account{" +
"id=" + id +
", actno='" + actno + '\'' +
", balance=" + balance +
'}';
}
public Account() {
}
public Account(Long id, String actno, Double balance) {
this.id = id;
this.actno = actno;
this.balance = balance;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getActno() {
return actno;
}
public void setActno(String actno) {
this.actno = actno;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
}
package com.powernode.bank.dao;
import com.powernode.bank.pojo.Account;
/**
* 账户数据访问对象
* @author 老杜
* @version 1.0
* @since 1.0
*/
public interface AccountDao {
/**
* 根据账号获取账户信息
* @param actno 账号
* @return 账户信息
*/
Account selectByActno(String actno);
/**
* 更新账户信息
* @param act 账户信息
* @return 1表示更新成功,其他值表示失败
*/
int update(Account act);
}
package com.powernode.bank.dao.impl;
import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
public class AccountDaoImpl implements AccountDao {
@Override
public Account selectByActno(String actno) {
SqlSession sqlSession = SqlSessionUtil.openSession();
Account act = (Account)sqlSession.selectOne("selectByActno", actno);
sqlSession.close();
return act;
}
@Override
public int update(Account act) {
SqlSession sqlSession = SqlSessionUtil.openSession();
int count = sqlSession.update("update", act);
sqlSession.commit();
sqlSession.close();
return count;
}
}
<mapper namespace="account">
<select id="selectByActno" resultType="com.powernode.bank.pojo.Account">
select * from t_act where actno = #{actno}
</select>
<update id="update">
update t_act set balance = #{balance} where actno = #{actno}
</update>
</mapper>
package com.powernode.bank.exception;
/**
* 余额不足异常
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class MoneyNotEnoughException extends Exception{
public MoneyNotEnoughException(){}
public MoneyNotEnoughException(String msg){ super(msg); }
}
package com.powernode.bank.exception;
/**
* 应用异常
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class AppException extends Exception{
public AppException(){}
public AppException(String msg){ super(msg); }
}
package com.powernode.bank.service;
import com.powernode.bank.exception.AppException;
import com.powernode.bank.exception.MoneyNotEnoughException;
/**
* 账户业务类。
* @author 老杜
* @version 1.0
* @since 1.0
*/
public interface AccountService {
/**
* 银行账户转正
* @param fromActno 转出账户
* @param toActno 转入账户
* @param money 转账金额
* @throws MoneyNotEnoughException 余额不足异常
* @throws AppException App发生异常
*/
void transfer(String fromActno, String toActno, double money) throws MoneyNotEnoughException, AppException;
}
package com.powernode.bank.service.impl;
import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.dao.impl.AccountDaoImpl;
import com.powernode.bank.exception.AppException;
import com.powernode.bank.exception.MoneyNotEnoughException;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.service.AccountService;
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao = new AccountDaoImpl();
@Override
public void transfer(String fromActno, String toActno, double money) throws MoneyNotEnoughException, AppException {
// 查询转出账户的余额
Account fromAct = accountDao.selectByActno(fromActno);
if (fromAct.getBalance() < money) {
throw new MoneyNotEnoughException("对不起,您的余额不足。");
}
try {
// 程序如果执行到这里说明余额充足
// 修改账户余额
Account toAct = accountDao.selectByActno(toActno);
fromAct.setBalance(fromAct.getBalance() - money);
toAct.setBalance(toAct.getBalance() + money);
// 更新数据库
accountDao.update(fromAct);
accountDao.update(toAct);
} catch (Exception e) {
throw new AppException("转账失败,未知原因!");
}
}
}
package com.powernode.bank.web.controller;
import com.powernode.bank.exception.AppException;
import com.powernode.bank.exception.MoneyNotEnoughException;
import com.powernode.bank.service.AccountService;
import com.powernode.bank.service.impl.AccountServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 账户控制器
* @author 老杜
* @version 1.0
* @since 1.0
*/
@WebServlet("/transfer")
public class AccountController extends HttpServlet {
private AccountService accountService = new AccountServiceImpl();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取响应流
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 获取账户信息
String fromActno = request.getParameter("fromActno");
String toActno = request.getParameter("toActno");
double money = Integer.parseInt(request.getParameter("money"));
// 调用业务方法完成转账
try {
accountService.transfer(fromActno, toActno, money);
out.print("<h1>转账成功!!!</h1>");
} catch (MoneyNotEnoughException e) {
out.print(e.getMessage());
} catch (AppException e) {
out.print(e.getMessage());
}
}
}
银行账户转账
LOCALHOST:8080/BANK/
转出账户:
ACT001
转入账户:
ACT002
转账金额:
10000
转账
LOCALHOST:8080/BANK/TRANSFER
转账成功!
对象
T.ACT@POWERNODE(LOCALHOST)-表
园文本?筛选,三排序[6导入(几导出
开始事务
胆数据
BALANCE
ACTNO
40000.00
ACT001
10000.00
ACT002
try (SqlSession session = sqlSessionFactory.openSession()) {
// 你的应用逻辑代码
}
package com.powernode.bank.service.impl;
import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.dao.impl.AccountDaoImpl;
import com.powernode.bank.exception.AppException;
import com.powernode.bank.exception.MoneyNotEnoughException;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.service.AccountService;
import com.powernode.bank.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao = new AccountDaoImpl();
@Override
public void transfer(String fromActno, String toActno, double money) throws MoneyNotEnoughException, AppException {
// 查询转出账户的余额
Account fromAct = accountDao.selectByActno(fromActno);
if (fromAct.getBalance() < money) {
throw new MoneyNotEnoughException("对不起,您的余额不足。");
}
try {
// 程序如果执行到这里说明余额充足
// 修改账户余额
Account toAct = accountDao.selectByActno(toActno);
fromAct.setBalance(fromAct.getBalance() - money);
toAct.setBalance(toAct.getBalance() + money);
// 更新数据库(添加事务)
SqlSession sqlSession = SqlSessionUtil.openSession();
accountDao.update(fromAct);
// 模拟异常
String s = null;
s.toString();
accountDao.update(toAct);
sqlSession.commit();
sqlSession.close();
} catch (Exception e) {
throw new AppException("转账失败,未知原因!");
}
}
}
对象
T.ACT@POWERNODE(LOCALHOST)-表
园文本?筛选,三排序[6导入(几导出
开始事务
胆数据
BALANCE
ACTNO
40000.00
ACT001
10000.00
ACT002
个个
LOCALHOST:8080/BANK/
转出账户:
ACT001
转入账户:
ACT002
转账金额:
10000
转账
LOCALHOST:8080/BANK/TRANSFER
转账失败,未知原因!
对象
TACT@POWERNODE(LOCALHOST)-表
目开始事务
6导入[导出
目文本?筛选
照
ID
BALANCE
ACTNO
30000.00
ACT001
10000.00
ACT002
package com.powernode.bank.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* MyBatis工具类
*
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class SqlSessionUtil {
private static SqlSessionFactory sqlSessionFactory;
/**
* 类加载时初始化sqlSessionFactory对象
*/
static {
try {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
private static ThreadLocal<SqlSession> local = new ThreadLocal<>();
/**
* 每调用一次openSession()可获取一个新的会话,该会话支持自动提交。
*
* @return 新的会话对象
*/
public static SqlSession openSession() {
SqlSession sqlSession = local.get();
if (sqlSession == null) {
sqlSession = sqlSessionFactory.openSession();
local.set(sqlSession);
}
return sqlSession;
}
/**
* 关闭SqlSession对象
* @param sqlSession
*/
public static void close(SqlSession sqlSession){
if (sqlSession != null) {
sqlSession.close();
}
local.remove();
}
}
package com.powernode.bank.dao.impl;
import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
public class AccountDaoImpl implements AccountDao {
@Override
public Account selectByActno(String actno) {
SqlSession sqlSession = SqlSessionUtil.openSession();
Account act = (Account)sqlSession.selectOne("account.selectByActno", actno);
return act;
}
@Override
public int update(Account act) {
SqlSession sqlSession = SqlSessionUtil.openSession();
int count = sqlSession.update("account.update", act);
return count;
}
}
package com.powernode.bank.service.impl;
import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.dao.impl.AccountDaoImpl;
import com.powernode.bank.exception.AppException;
import com.powernode.bank.exception.MoneyNotEnoughException;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.service.AccountService;
import com.powernode.bank.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao = new AccountDaoImpl();
@Override
public void transfer(String fromActno, String toActno, double money) throws MoneyNotEnoughException, AppException {
// 查询转出账户的余额
Account fromAct = accountDao.selectByActno(fromActno);
if (fromAct.getBalance() < money) {
throw new MoneyNotEnoughException("对不起,您的余额不足。");
}
try {
// 程序如果执行到这里说明余额充足
// 修改账户余额
Account toAct = accountDao.selectByActno(toActno);
fromAct.setBalance(fromAct.getBalance() - money);
toAct.setBalance(toAct.getBalance() + money);
// 更新数据库(添加事务)
SqlSession sqlSession = SqlSessionUtil.openSession();
accountDao.update(fromAct);
// 模拟异常
String s = null;
s.toString();
accountDao.update(toAct);
sqlSession.commit();
SqlSessionUtil.close(sqlSession); // 只修改了这一行代码。
} catch (Exception e) {
throw new AppException("转账失败,未知原因!");
}
}
}
对象
TACT@POWERNODE(LOCALHOST)-表
目开始事务
6导入[导出
目文本?筛选
照
ID
BALANCE
ACTNO
30000.00
ACT001
10000.00
ACT002
个个
LOCALHOST:8080/BANK/
转出账户:
ACT001
转入账户:
ACT002
转账金额:
10000
转账
LOCALHOST:8080/BANK/TRANSFER
转账失败,未知原因!
对象
TACT@POWERNODE(LOCALHOST)-表
目开始事务
6导入[导出
目文本?筛选
照
ID
BALANCE
ACTNO
30000.00
ACT001
10000.00
ACT002
个个
LOCALHOST:8080/BANK/
转出账户:
ACT001
转入账户:
ACT002
转账金额:
10000
转账
LOCALHOST:8080/BANK/TRANSFER
转账成功!
对象
T_ACT@POWERNODE(LOCALHOST)-表
开始事务
[6导入
导出
园文本?筛选,三排序
ID
BALANCE
ACTNO
20000.00
ACT001
20000.00
ACT002
个个Q
LOCALHOST:8080/BANK/
转出账户:
ACT001
转入账户:
ACT002
转账金额:
30000
转账
LOCALHOST:8080/BANK/TRANSFER
对不起,您的余额不足.
对象
T_ACT@POWERNODE(LOCALHOST)-表
开始事务
[6导入
导出
园文本?筛选,三排序
ID
BALANCE
ACTNO
20000.00
ACT001
20000.00
ACT002
package com.powernode.bank.dao.impl;
import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
public class AccountDaoImpl implements AccountDao {
@Override
public Account selectByActno(String actno) {
SqlSession sqlSession = SqlSessionUtil.openSession();
Account act = (Account)sqlSession.selectOne("account.selectByActno", actno);
return act;
}
@Override
public int update(Account act) {
SqlSession sqlSession = SqlSessionUtil.openSession();
int count = sqlSession.update("account.update", act);
return count;
}
}
N
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.29.1-GA</version>
</dependency>
package com.powernode.javassist;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import java.lang.reflect.Method;
public class JavassistTest {
public static void main(String[] args) throws Exception {
// 获取类池
ClassPool pool = ClassPool.getDefault();
// 创建类
CtClass ctClass = pool.makeClass("com.powernode.javassist.Test");
// 创建方法
// 1.返回值类型 2.方法名 3.形式参数列表 4.所属类
CtMethod ctMethod = new CtMethod(CtClass.voidType, "execute", new CtClass[]{}, ctClass);
// 设置方法的修饰符列表
ctMethod.setModifiers(Modifier.PUBLIC);
// 设置方法体
ctMethod.setBody("{System.out.println(\"hello world\");}");
// 给类添加方法
ctClass.addMethod(ctMethod);
// 调用方法
Class<?> aClass = ctClass.toClass();
Object o = aClass.newInstance();
Method method = aClass.getDeclaredMethod("execute");
method.invoke(o);
}
}
COM.POWERNODEJAVASSIST.JAVASSISTTEST
NAME:
STORE AS PROJECT FILE
LOCAL MACHINE
MANAGE TARGETS...
RUN ON:
RUN CONFIGURATIONS MAY BE EXECUTED LOCALLY OR ON A TARGET:FOR
EXAMPLE IN A DOCKER CONTAINER OR ON A REMOTE HOST USING SSH.
ALT+M
BUILD AND RUN
MODIFY OPTIONS
JAVASSIST-TEST
JAVA 17 SDK OF 'JAVASSIST-TEST' MODULE
-CP
目
COM.POWERNODE.JAVASSIST.JAVASSISTTEST
-ADD-OPENS JAVA.BASE/JAVA.LANGEALL-UNNAMED
目
-ADD-OPENS JAVA.BASE/SUN.NET.UTIL-ALL-UNNAMED
PRESS ALT FOR FIELD HINTS
D:/POWERNODE\MYBATIS/CODE\MYBATIS
WORKING DIRECTORY:
ENVIRONMENT VARIABLES:
SEPARATE VARIABLES WITH SEMICOLON:VAR-VALUE; VAR1-VALUE1
OPEN RUN/DEBUG TOOL WINDOW WHEN STARTED
COM.POWERNODEJAVASSIST.JAVASSISTTEST X
C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE
HELLO WORLD
PROCESS FINISHED WITH EXIT CODE
0
package com.powernode.bank.utils;
import org.apache.ibatis.javassist.CannotCompileException;
import org.apache.ibatis.javassist.ClassPool;
import org.apache.ibatis.javassist.CtClass;
import org.apache.ibatis.javassist.CtMethod;
import org.apache.ibatis.session.SqlSession;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
/**
* 使用javassist库动态生成dao接口的实现类
*
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class GenerateDaoByJavassist {
/**
* 根据dao接口生成dao接口的代理对象
*
* @param sqlSession sql会话
* @param daoInterface dao接口
* @return dao接口代理对象
*/
public static Object getMapper(SqlSession sqlSession, Class daoInterface) {
ClassPool pool = ClassPool.getDefault();
// 生成代理类
CtClass ctClass = pool.makeClass(daoInterface.getPackageName() + ".impl." + daoInterface.getSimpleName() + "Impl");
// 接口
CtClass ctInterface = pool.makeClass(daoInterface.getName());
// 代理类实现接口
ctClass.addInterface(ctInterface);
// 获取所有的方法
Method[] methods = daoInterface.getDeclaredMethods();
Arrays.stream(methods).forEach(method -> {
// 拼接方法的签名
StringBuilder methodStr = new StringBuilder();
String returnTypeName = method.getReturnType().getName();
methodStr.append(returnTypeName);
methodStr.append(" ");
String methodName = method.getName();
methodStr.append(methodName);
methodStr.append("(");
Class<?>[] parameterTypes = method.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) {
methodStr.append(parameterTypes[i].getName());
methodStr.append(" arg");
methodStr.append(i);
if (i != parameterTypes.length - 1) {
methodStr.append(",");
}
}
methodStr.append("){");
// 方法体当中的代码怎么写?
// 获取sqlId(这里非常重要:因为这行代码导致以后namespace必须是接口的全限定接口名,sqlId必须是接口中方法的方法名。)
String sqlId = daoInterface.getName() + "." + methodName;
// 获取SqlCommondType
String sqlCommondTypeName = sqlSession.getConfiguration().getMappedStatement(sqlId).getSqlCommandType().name();
if ("SELECT".equals(sqlCommondTypeName)) {
methodStr.append("org.apache.ibatis.session.SqlSession sqlSession = com.powernode.bank.utils.SqlSessionUtil.openSession();");
methodStr.append("Object obj = sqlSession.selectOne(\"" + sqlId + "\", arg0);");
methodStr.append("return (" + returnTypeName + ")obj;");
} else if ("UPDATE".equals(sqlCommondTypeName)) {
methodStr.append("org.apache.ibatis.session.SqlSession sqlSession = com.powernode.bank.utils.SqlSessionUtil.openSession();");
methodStr.append("int count = sqlSession.update(\"" + sqlId + "\", arg0);");
methodStr.append("return count;");
}
methodStr.append("}");
System.out.println(methodStr);
try {
// 创建CtMethod对象
CtMethod ctMethod = CtMethod.make(methodStr.toString(), ctClass);
ctMethod.setModifiers(Modifier.PUBLIC);
// 将方法添加到类
ctClass.addMethod(ctMethod);
} catch (CannotCompileException e) {
throw new RuntimeException(e);
}
});
try {
// 创建代理对象
Class<?> aClass = ctClass.toClass();
Constructor<?> defaultCon = aClass.getDeclaredConstructor();
Object o = defaultCon.newInstance();
return o;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
<mapper namespace="com.powernode.bank.dao.AccountDao">
<select id="selectByActno" resultType="com.powernode.bank.pojo.Account">
select * from t_act where actno = #{actno}
</select>
<update id="update">
update t_act set balance = #{balance} where actno = #{actno}
</update>
</mapper>
1MPORT OFG.APACHE.2BATIS.SESSION.SQLSESSION;
2 USAGES
PUBLIC CLASS ACCOUNTSERVICEIMPL IMPLEMENTS ACCOUNTSERVICE (
//PRIVATE ACCOUNTDAO ACCOUNTDAO ; NEW ACCOUNTDAOIMPL();
4 USAGES
(ACCOUNTDAO)GENERATEDAOBYJAVASSIST.GETHAPPER(SALSALSESSIONUTIL.OPENSESSIOND), ACCOUNTDAD.CLASS)
PRIVATE
ACCOUNTDAO
ACCOUNTDAO
L USAGE
DEBUGGER
TOMCAT LOCALHOST LOG
TOMCAT CATALINA LOG
SERVER
MYBATIS-004-WEB:WAR EXPLODED
"C:\DEV/APACHE-TAMSAT-18.8,23/BIN/BOOTSTRAP-JAR;C:(DEY/APACHE-TOMCAT-10-0,23/BIN)TONCAT-IOLI-JAN
USING CLASSPATH:
USING CATALINA_OPTS:
--ADD-OPENS:JAVA.BASE/JAVA.LANG-ALL-UNNAMEDL
NOTE: PICKED UP JDK_JAVA_OPTIONS:
--ADD-OPENS:JAVA.BASE/JAVA.IO:ALL-UNNAMEDI
VM, ADDRESS:'127.0.0.0.1456', TRANSPORT:
CONNECTED TO THE TARGET
:SOCKET
对象
TACT@POWERNODE(LOCALHOST)表
目开始事务
[6导入口导
目文本?筛选
ID
BALANCE
ACTNO
10000.00
ACT001
30000.00
ACT002
个个Q
LOCALHOST:8080/BANK/
转出账户:
ACT001
转入账户:
ACT002
转账金额:
10000
转账
LOCALHOST:8080/BANK/TRANSFER
LOCALHOST:8080/BANK/TRANSFER
转账成功!
T.ACT@POWERNODE(LOCALHOST)-表
对象
6导入口导
?筛选 ,排序
文本
开始事务
ID
BALANCE
ACTNO
0.00
ACT001
40000.00
ACT002
N
AccountDao accountDao = (AccountDao)sqlSession.getMapper(AccountDao.class);
2 USAGES
PUBLIC CLASS ACCOUNTSERVICEIMPL IMPLEMENTS ACCOUNTSERVICE F
中国
/PRIVATE ACCOUNTDAO ACCOUNTDAO - NEW ACCOUNTDAOIMPL();
4 USAGES
I USAGE
目开始事务
文本?筛选,三排
排序
ID
BALANCE
ACTNO
10000.00
ACT001
2
40000.00
ACT002
6导入
目开始事务
文本?筛选,排序
P!
BALANCE
ACTNO
0.00
ACT001
ACT002
50000.00
N
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.powernode</groupId>
<artifactId>mybatis-005-antic</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!--junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--logback依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
</project>
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/powernode
jdbc.username=root
jdbc.password=root
package com.powernode.mybatis.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* MyBatis工具类
*
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class SqlSessionUtil {
private static SqlSessionFactory sqlSessionFactory;
/**
* 类加载时初始化sqlSessionFactory对象
*/
static {
try {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
private static ThreadLocal<SqlSession> local = new ThreadLocal<>();
/**
* 每调用一次openSession()可获取一个新的会话,该会话支持自动提交。
*
* @return 新的会话对象
*/
public static SqlSession openSession() {
SqlSession sqlSession = local.get();
if (sqlSession == null) {
sqlSession = sqlSessionFactory.openSession();
local.set(sqlSession);
}
return sqlSession;
}
/**
* 关闭SqlSession对象
* @param sqlSession
*/
public static void close(SqlSession sqlSession){
if (sqlSession != null) {
sqlSession.close();
}
local.remove();
}
}
package com.powernode.mybatis.pojo;
/**
* 普通实体类:汽车
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class Car {
private Long id;
private String carNum;
private String brand;
private Double guidePrice;
private String produceTime;
private String carType;
// 构造方法
// set get方法
// toString方法
}
package com.powernode.mybatis.mapper;
import com.powernode.mybatis.pojo.Car;
import java.util.List;
/**
* Car的sql映射对象
* @author 老杜
* @version 1.0
* @since 1.0
*/
public interface CarMapper {
/**
* 根据car_num获取Car
* @param carType
* @return
*/
List<Car> selectByCarType(String carType);
}
<configuration>
<properties resource="jdbc.properties"/>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
<mapper namespace="com.powernode.mybatis.mapper.CarMapper">
<select id="selectByCarType" resultType="com.powernode.mybatis.pojo.Car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
where
car_type = #{carType}
</select>
</mapper>
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.CarMapper;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtil;
import org.junit.Test;
import java.util.List;
/**
* CarMapper测试类
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class CarMapperTest {
@Test
public void testSelectByCarType(){
CarMapper mapper = (CarMapper) SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = mapper.selectByCarType("燃油车");
cars.forEach(car -> System.out.println(car));
}
}
TESTS PASSED:1 OF 1 TEST -1 SEC 34MS
CTRANSACTION - OPENING JDBC CONNECTION
ADDATASOURCE - CREATED CONNECTION 848097505.
STRANSACTION - SETTING AUTOCONNIT TO FALSS ON JDEC CONNECTION (CON.RYSQL.CI-J BC.CONNECTIONIANIA338CF
ERTYPE
YPE - E> PREPARING
PARAMETERS:燃油车(STRING)
ARTYPE
TOTAL:38
ARTYPE
2-09-01
三燃油车子
CARTYPE
20-10-01', CARTYPE:'燃油车'}
20-10-01', CARTYPE;'燃油车'}
20-10-11', CARTYPE:'燃油车'}
20-10-11', CARTYPE:'燃油车'}
-A1.1A! CARTVNE:'燃油车'!
<mapper namespace="com.powernode.mybatis.mapper.CarMapper">
<select id="selectByCarType" resultType="com.powernode.mybatis.pojo.Car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
where
<!--car_type = #{carType}-->
car_type = ${carType}
</select>
</mapper>
ORG.APACHE.IBATIS.EXCEPTIONS.PERSISTENCEEXCEPTION:
ERROR QUERYING DATABASE.
JAVA.SQL.SQLSYNTAXERROREXCEPTION: UNKNOWN COLUMN '燃油车" IN 'WHERE CLAUSE'
###
CAUSE:JA
THE ERROR MAY EXIST IN
CARMAPPER.XML
###
E ERROR MAY INVOLVE DEF
E DEFAULTPARAMETERMAP
### THE E
THE ERROR OCCURRED WHILE SETTING PA
CING PARAMETERS
SQL: SELECT
D.CAR NUM AS CARNUM,BRAND,QUIDE PRICE AN
###
GUIDEPRICE,PRODUCE-TIME AS PRODUCETIME,CAR-TY
ICE AS
I CAUSE: JAVA.SQL.SQLSYNTAXERROREXCEPTION:
UNKNOWN COLUMN''燃油车'
IN 'WHERE CLAUSE'
###
ORG.APACHE.IBATIS.EXCEPTIONS.EXCEPTIONFACTORY.WRAPEXCEPTIAN(EXCEPTIONFACTARY.IAVA;3D
AT
ORA-ADACHE-IBATIS-SESSION,DEFAULTS,PEFAULTSALTSAISESSIAN-SELEGTLIST(DEFAULTSALSESSION-TAVA;1AVA;153
AT
1 OF 1 TEST-968MS
NSACTION - OPENING JDBC CONNECTION
TASOURCE - CREATED CONNECTION 276869158.
NSACTION - SETTING AUTOCONMIT TO FALSE ON JDEC CONNECTION (CON (CON-NYSQL.CINBC.CONNECTIONIMDLA19882
PE - S> PREPARING:
燃油车
PE - SS> PARAMETERS:
<mapper namespace="com.powernode.mybatis.mapper.CarMapper">
<select id="selectByCarType" resultType="com.powernode.mybatis.pojo.Car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
where
<!--car_type = #{carType}-->
<!--car_type = ${carType}-->
car_type = '${carType}'
</select>
</mapper>
SOURCE - POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
ACTION - OPENING JDBC CONNECTION
SOURCE - CREATED CONNECTION 276869158.
ACTION - SETTING AUTOCOMNIT TO FALSE ON JDAC CONNECTION (COM.MYSQL.CJ-JDBS.CONNECTIONIAPLE188888826]
燃油车!
CAR TYPE AS CARTYPE FROM T_CAR WHERE CAR_TYPE
SS> PREPA
PARAMETERS:
TOTAL:38
CARTYPE燃油车`]
01,CARTYPE:'燃油车`}
01',CARTYPE:'燃油车'}
/**
* 查询所有的Car
* @param ascOrDesc asc或desc
* @return
*/
List<Car> selectAll(String ascOrDesc);
<select id="selectAll" resultType="com.powernode.mybatis.pojo.Car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
order by carNum #{key}
</select>
@Test
public void testSelectAll(){
CarMapper mapper = (CarMapper) SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = mapper.selectAll("desc");
cars.forEach(car -> System.out.println(car));
}
TESTS FAILED:1 OF 1 TEST-903 MS
3GING INITIALIZED USING 'CLASS ORG.APACHE.IBATIS.LOGGING.SLF4J.SLF4JIMPL' ADAPTER.
- POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
ATASOURCE
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
ATASOURCE
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
ATASOURCE
POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
ATASOURCE
OPENING DBC CONNECTION
ANSACTION
- CREATED CONNECTION 635610193.
ATASOURCE
ANS3CTION - SOTTING AUTOCONNIT TO FALSE ON JDBC CONNECTION [CON (CON.MYSQL.CI-JDBC.CONIMPLOZ5E23451]
LECTALL-
LECTALL - SE> PARAMETERS:DI
DESC(STRING)
OR THE RIGHT
B AN ERROR IN YOUR SQL SYNTAX: CHECK THE NANUAL THAT CORRESPONDS TO YOUR HYSQL SERVERVER VERSION FOR
AT LINE
DESC'
T SYNTAX TO USE NEAR
<select id="selectAll" resultType="com.powernode.mybatis.pojo.Car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
<!--order by carNum #{key}-->
order by carNum ${key}
</select>
TS PASSED:1 OF 1 TEST -1SEC 8MS
IG INITIALIZED USING 'CLASS ORG.APACHE.IBATIS.LAGGING.SLF4J.SLFAJIMPL' ADAPTER.
SOURCE - POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS:
SOURCE - POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
SOURCE - POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
SOURCE - POOLEDDATASOURCE FORCEFULLY CLOSED/REMOVED ALL CONNECTIONS.
ACTION-0PENING JDBC CONNECTION
SOURCE - CREATED CONNECTION 1491860739.
ACTION - SETTING AUTOCONMIT TO FALSE ON JDEC CONNECTION [CON.NYSQL.CI-JDBC.CONNECTIONIAPLG58EBFDOS]
DESC
T_CARORDER
CARNUM
BY
TALL
三> PARAMETERS:
TOTAL:40
TALL
CARTYPE 燃油车}
<select id="selectAllByTableName" resultType="car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
${tableName}
</select>
/**
* 根据表名查询所有的Car
* @param tableName
* @return
*/
List<Car> selectAllByTableName(String tableName);
@Test
public void testSelectAllByTableName(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = mapper.selectAllByTableName("t_car");
cars.forEach(car -> System.out.println(car));
}
ISEC 521MS
SIA [IS ASSIGNABLE TO OBJECT]
CLASS COM.POWERNODE.MYBATIS.MAPPER.CARMAPPER MATCHES CRITERIA
PENING JDBC CONNECTION
REATED CONNECTION 821405322.
ON JDBC CONNECTION [COM.MYSQL.CJ.JDBC.CONNECTIONIMPLO30F5A68AL
ETTING AUTOCOMMIT TO FALSE ON JDBC (
PARAMETERS:
TOTAL:40
'燃油车子
E'电车子
PE-'燃油车'}
全选
删除
张三
李四
王五
赵六
/**
* 根据id批量删除
* @param ids
* @return
*/
int deleteBatch(String ids);
<delete id="deleteBatch">
delete from t_car where id in(${ids})
</delete>
@Test
public void testDeleteBatch(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
int count = mapper.deleteBatch("1,2,3");
System.out.println("删除了几条记录:" + count);
SqlSessionUtil.openSession().commit();
}
OPENING
ON.JDBC.JDBCTRANSACTION
CONNECTION
JDBC
CREATED CONNECTION 1478995734.
POOLED.POOLEDDATASOURCE
ON.JDBC.JDBCTRANSACTION - SETTING AUTOCOMNIT TO FALSE ON JDBC CONNECTION
[COM.MYSQ
PREPARING: DELETE FROM T_CAR WHERE ID IN(1,2,3)
.CARMAPPER.DELETEBATCH
PARAMETERS:
CARMAPPER.DELETEBATCH
UPDATES: 2
CARMAPPER.DELETEBATCH
/**
* 根据品牌进行模糊查询
* @param likeBrank
* @return
*/
List<Car> selectLikeByBrand(String likeBrank);
<select id="selectLikeByBrand" resultType="Car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
where
brand like '%${brand}%'
</select>
@Test
public void testSelectLikeByBrand(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = mapper.selectLikeByBrand("奔驰");
cars.forEach(car -> System.out.println(car));
}
OPENING JDBC CONNECTION
CREATED CONNECTION 505231702.
- SETTING AUTOCOMMIT TO FALSE ON JDEC CONNECTION [COM,MYSQL.CJ.JDBC.CONNECTIONIMPLELD3956]
PARAMETERS:
TOTAL:4
ARTYPE'燃油车马
ARTYPE'燃油车子
ARTYPE '燃油车了
ARTYPE'燃油车}
<select id="selectLikeByBrand" resultType="Car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
where
brand like concat('%',#{brand},'%')
</select>
<select id="selectLikeByBrand" resultType="Car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
where
brand like "%"#{brand}"%"
</select>
BD CONNECT1ON 803893384.
NG AUTOCOMNIT TO FALSE ON JDBC CONNECTION [COM.MYSQL.CJ.JDBC.CONNECTIONIMPLO2FEA7088]
"% 2 %"
ETERS:奔驰(STRING)
TOTAL:4
燃油车子
燃油车}
燃油车了
燃油车子
<mapper namespace="com.powernode.mybatis.mapper.CarMapper">
<select id="selectAll" resultType="com.powernode.mybatis.pojo.Car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
order by carNum ${key}
</select>
<select id="selectByCarType" resultType="com.powernode.mybatis.pojo.Car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
where
car_type = '${carType}'
</select>
</mapper>
<typeAliases>
<typeAlias type="com.powernode.mybatis.pojo.Car" alias="Car"/>
</typeAliases>
<typeAliases>
<package name="com.powernode.mybatis.pojo"/>
</typeAliases>
<mapper namespace="com.powernode.mybatis.mapper.CarMapper">
<select id="selectAll" resultType="CAR">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
order by carNum ${key}
</select>
<select id="selectByCarType" resultType="car">
select
id,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from
t_car
where
car_type = '${carType}'
</select>
</mapper>
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<mappers>
<mapper class="com.powernode.mybatis.mapper.CarMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="com.powernode.mybatis.mapper"/>
</mappers>
F
SETTINGS
EDITOR > FILE AND CODE TEMPLATES
DEFAULT
APPEARANCE&BEHAVIOR
SCHEME:
KEYMAP
OTHER
FILES
CODE
INCLUDES
EDITOR
GENERAL
回一切+
NAME:
SQLMAPPER
EXTENSION:
XML
CODE EDITING
IR KOTLIN WORKSHEET
不指定文件名,新建时会提示输入文件名
FILE
NAME:
PAT
AND
FONT
IR KOTLIN SCRIPT
CSS FILE
VERSION "1.0" ENCODING "UTF-8"
COLOR SCHEME
<?XML
STYLUS FILE
圆
CODE STYLE
<!DOCTYPE MAPPER
SASS FILE
INSPECTIONS
-//MYBATIS.ORG//DTD MAPPER 3.0//E
PUBLIC
SCSS FILE
FILE AND CODE TEMPLATES
LESS FILE
"HTTP://MYBATIS.ORG/DTD/MYBATIS-3-MAPPER.
GROOVY CLASS
FILE ENCODINGS
GROOWY INTERFACE
LIVE TEMPLATES
<MAPPER NAMESPACE "">
GROOVY TRAIT
FILE TYPES
GROOVY ENUM
ANDROID DESIGN TOOLS
GROOW ANNOTATION
</MAPPER>
GROOVY SCRIPT
COPYRIGHT
GROOVY DSL SCRIPT
INLAY HINTS
REFORMAT ACCORDING TO STYLE
ENABLE LIVE TEMPLATES
GANT SCRIPT
DUPLICATES
JAVASCRIPT FILE
DESCRIPTION:
EMMET
TYPESCRIPT FILE
IN FILE TEMPLATES, YOU CAN USE TEXT, CODE, COMMENTS, AND PREDEFINED VARIABLES,
TYPESCRIPT JSX FILE
GUI DESIGNER
A LIST OF PREDEFINED VARIABLES IS AVAILABLE BELOW. WHEN YOU USE THESE VARIABLES
TSCONFIG.JSON
IN TEMPLATES, THEY EXPAND INTO CORRESPONDING VALUES LATER IN THE EDITOR.
INTENTIONS
PACKAGE.JSON
IT IS ALSO POSSIBLE TO SPECIFY CUSTOM VARIABLES, CUSTOM VARIABLES USE THE
LANGUAGEINJECTIONS
JAVAFXAPPLICATION
FOLLOWING FORMAT: SIVARIABLE NAMEY, WHERE VARIABLE NAME IS A NAME FOR YOUR
VARIABLE (FOR EXAMPLE,S(MY CUSTOM FUNCTIONLNAME), BEFORE THE IDE CREATES A
LIVE EDIT OF COMPOSE LITERALS
MYBATIS-CONFIG
NEW FIE WITH CUSTOM VARIABLES, YOU SEE A DIALOG WHERE YOU CAN DEFINE VALUES FOR
SQLMAPPER
NATURAL LANGUAGES
CUSTOM VARIABLES IN THE TEMPLATE.
READERMODE
OK
APPLY
CANCEL
USER用户表
ID
NALE
小明
1
小花
2
T_ROLE角色表
ID
USER_ID
NALE
项目经理
1
技术总监
2
1
JAVA软件工程师
3
1
2
CEO
组长
5
2
测试员
2
6
/**
* 获取自动生成的主键
* @param car
*/
void insertUseGeneratedKeys(Car car);
<insert id="insertUseGeneratedKeys" useGeneratedKeys="true" keyProperty="id">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
</insert>
@Test
public void testInsertUseGeneratedKeys(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
Car car = new Car();
car.setCarNum("5262");
car.setBrand("BYD汉");
car.setGuidePrice(30.3);
car.setProduceTime("2020-10-11");
car.setCarType("新能源");
mapper.insertUseGeneratedKeys(car);
SqlSessionUtil.openSession().commit();
System.out.println(car.getId());
}
N
对象
T STUDENT @POWERNODE (LOCALHOST) -
山下移
个上移
添加字段
删除字段
插入字段
主键
保存
字段
触发器
外键
注释
索引
检查
SQL预览
选项
不是NULL
名
小数点
类型
长度
虚拟
键
ID
BIGINT
255
VARCHAR
NAME
INT
AGE
DOUBLE
HEIGHT
BIRTH
DATE
1
CHAR
SEX
对象
T.STUDENT @POWERNODE (LOCALHOST) -
00创建图表
本?筛选,三排序[6导出
开始事务
数据生成
文本?
ID
BIRTH
HEIGHT
NAME
SEX
AGE
男
2张三
20
1.81 2022-08-16
女
1.81 2022-08-16
3张三
20
package com.powernode.mybatis.pojo;
import java.util.Date;
/**
* 学生类
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class Student {
private Long id;
private String name;
private Integer age;
private Double height;
private Character sex;
private Date birth;
// constructor
// setter and getter
// toString
}
package com.powernode.mybatis.mapper;
import com.powernode.mybatis.pojo.Student;
import java.util.Date;
import java.util.List;
/**
* 学生数据Sql映射器
* @author 老杜
* @version 1.0
* @since 1.0
*/
public interface StudentMapper {
/**
* 根据name查询
* @param name
* @return
*/
List<Student> selectByName(String name);
/**
* 根据id查询
* @param id
* @return
*/
Student selectById(Long id);
/**
* 根据birth查询
* @param birth
* @return
*/
List<Student> selectByBirth(Date birth);
/**
* 根据sex查询
* @param sex
* @return
*/
List<Student> selectBySex(Character sex);
}
<mapper namespace="com.powernode.mybatis.mapper.StudentMapper">
<select id="selectByName" resultType="student">
select * from t_student where name = #{name}
</select>
<select id="selectById" resultType="student">
select * from t_student where id = #{id}
</select>
<select id="selectByBirth" resultType="student">
select * from t_student where birth = #{birth}
</select>
<select id="selectBySex" resultType="student">
select * from t_student where sex = #{sex}
</select>
</mapper>
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.StudentMapper;
import com.powernode.mybatis.pojo.Student;
import com.powernode.mybatis.utils.SqlSessionUtil;
import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class StudentMapperTest {
StudentMapper mapper = SqlSessionUtil.openSession().getMapper(StudentMapper.class);
@Test
public void testSelectByName(){
List<Student> students = mapper.selectByName("张三");
students.forEach(student -> System.out.println(student));
}
@Test
public void testSelectById(){
Student student = mapper.selectById(2L);
System.out.println(student);
}
@Test
public void testSelectByBirth(){
try {
Date birth = new SimpleDateFormat("yyyy-MM-dd").parse("2022-08-16");
List<Student> students = mapper.selectByBirth(birth);
students.forEach(student -> System.out.println(student));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
@Test
public void testSelectBySex(){
List<Student> students = mapper.selectBySex('男');
students.forEach(student -> System.out.println(student));
}
}
<select id="selectByName" resultType="student" parameterType="java.lang.String">
select * from t_student where name = #{name, javaType=String, jdbcType=VARCHAR}
</select>
/**
* 根据name和age查询
* @param paramMap
* @return
*/
List<Student> selectByParamMap(Map<String,Object> paramMap);
@Test
public void testSelectByParamMap(){
// 准备Map
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("nameKey", "张三");
paramMap.put("ageKey", 20);
List<Student> students = mapper.selectByParamMap(paramMap);
students.forEach(student -> System.out.println(student));
}
<select id="selectByParamMap" resultType="student">
select * from t_student where name = #{nameKey} and age = #{ageKey}
</select>
/**
* 保存学生数据
* @param student
* @return
*/
int insert(Student student);
<insert id="insert">
insert into t_student values(null,#{name},#{age},#{height},#{birth},#{sex})
</insert>
@Test
public void testInsert(){
Student student = new Student();
student.setName("李四");
student.setAge(30);
student.setHeight(1.70);
student.setSex('男');
student.setBirth(new Date());
int count = mapper.insert(student);
SqlSessionUtil.openSession().commit();
}
/**
* 根据name和sex查询
* @param name
* @param sex
* @return
*/
List<Student> selectByNameAndSex(String name, Character sex);
@Test
public void testSelectByNameAndSex(){
List<Student> students = mapper.selectByNameAndSex("张三", '女');
students.forEach(student -> System.out.println(student));
}
<select id="selectByNameAndSex" resultType="student">
select * from t_student where name = #{name} and sex = #{sex}
</select>
ORG.APACHE.IBATIS.EXCEPTIONS.PERSISTENCEEXCEPTION:
### ERROR QUERYING DATABASE, CAUSE; ORG.APACHE.IBATIS,DINDINDING.BINDINGEXCEPTION: PARANETER
LE PARAMETERS ARE [ARG1, ARGO, PARAML, PARAM2]
NOT FOUND.
NAME
### CAUSE: ORQ.APACHE.IBATIS.BINDING.BINDINGEXCEPTION: PARAMETER
AVAILABLE
[ARG1, ARGO, PARAM1, PARAM2]
NOT FOUND.
NAME
PARAMETERS ARE
AT ORG,APACHE. IBATIS,EXCEPTIONS,EXCEPTIONFACTORY.WRAPEXCEPTION(EXCEPTIONFACTORY,IAVA;3D
AT ORG:APACHE,IBATIS,SESSION,DEFAULTS,DEFAULTS,SESSISESSION.SELECTLIST(DAFAULTSQLSESSION-JAVA;153)
AT ORG-APACHE:IBATIS.SESSION,DEFAULTS,DEFAULTSQLTSQLSESSION.SOLECTLIST(DEFAULTSGLSESSION-JAVA;145)
AT ORG-APACHE,IBATIS,SESSION,DEFAULTS,DEFAULTSAULTSASSION.SOLECTLIST(DAFAULTSQLTSOSSION-JAVA;14D)
<select id="selectByNameAndSex" resultType="student">
<!--select * from t_student where name = #{name} and sex = #{sex}-->
select * from t_student where name = #{arg0} and sex = #{arg1}
</select>
TALSE 0NDDDD
11231107
PREPARING: SELECT * FROM T_STUDENT WHERE
SEX
SELECTBYNAMEANDSEX
AND
NAME
出
张三(STRING),女(STRING)
SELECTBYNAMEANDSEX
PARAMETERS
TOTAL: 1
SELECTBYN
AMEANDSEX
AUG 16 00:00:00 CST 2022}
<select id="selectByNameAndSex" resultType="student">
<!--select * from t_student where name = #{name} and sex = #{sex}-->
<!--select * from t_student where name = #{arg0} and sex = #{arg1}-->
<!--select * from t_student where name = #{param1} and sex = #{param2}-->
select * from t_student where name = #{arg0} and sex = #{param2}
</select>
Map<String,Object> map = new HashMap<>();
map.put("arg0", name);
map.put("arg1", sex);
map.put("param1", name);
map.put("param2", sex);
// 所以可以这样取值:#{arg0} #{arg1} #{param1} #{param2}
// 其本质就是#{map集合的key}
/**
* 根据name和age查询
* @param name
* @param age
* @return
*/
List<Student> selectByNameAndAge(@Param(value="name") String name, @Param("age") int age);
@Test
public void testSelectByNameAndAge(){
List<Student> stus = mapper.selectByNameAndAge("张三", 20);
stus.forEach(student -> System.out.println(student));
}
<select id="selectByNameAndAge" resultType="student">
select * from t_student where name = #{name} and age = #{age}
</select>
MAPPENMEMOD
EXECUTERORMANY
G APACNE
STUDENTMAPPERTESTJAVA
INTEGERJAVA
STUDENTMAPPERJAVA
MAPPERPROXY.JAVA
STUDENTMAPPER.XML
MAPPERMETHODJAVA
37
38
1 USAGE
OBJECT EXECUTEFORMANY(SQLSESSION SQLSESSION, OBJECT[] ARGS) {
SQLSESSION: DEF
40
AMV
PRIVATE
RESULT;
41
LIST<E>
ARGS: OBJECT[2]@2447
42
METHOD.CONVERTARGSTOSQLCOMMANDPARAM(ARGS);
OBJECT
PARAM.
PARAM
D$METHODSIGNATURE@2445
Y OO PARAM - MAPPERMETHOD$PARAMMAP@2453)
43
IF
(METHOD
"张三
NAME
ROWBOUND
44
(GS)
"张三
PARAM1
PARAM, ROWBOUNDS);
45
RESULT
{NTEGER@2464120
?AGE
"PARAM2" - {NTEGER@2464)20
} ELSE{
46
47
RESULT
PARAM
SET VALUE F2 CREATE RENDERER
48
49
#510
ISSUE
COLLECTIONS & ARRAYS SUPPORT
IF (!METHOD.GETRETURNTYPE().ISASSIGNABLEFROM(RESULT.GETCLASS()
子
50
IF (METHOD.GETRETURNTYPE().ISARRAY())
51
N
package com.powernode.mybatis.mapper;
import com.powernode.mybatis.pojo.Car;
/**
* Car SQL映射器
* @author 老杜
* @version 1.0
* @since 1.0
*/
public interface CarMapper {
/**
* 根据id主键查询:结果最多只有一条
* @param id
* @return
*/
Car selectById(Long id);
}
<mapper namespace="com.powernode.mybatis.mapper.CarMapper">
<select id="selectById" resultType="Car">
select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car where id = #{id}
</select>
</mapper>
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.CarMapper;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtil;
import org.junit.Test;
public class CarMapperTest {
@Test
public void testSelectById(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
Car car = mapper.selectById(35L);
System.out.println(car);
}
}
LLATILLALLALLANDITE.RONTILLATILLATION CELLLTUG
DCBUG OR.DPDAGLE:10DLS.
COM.POWERNODE.MYBATIS.MAPPER.CARMAPPER.SELECTBYID -
2022-08-18 16:08:59.807 [MAIN]
DEBUG
PREPARING:
SELECT ID,CAL
金
2022-08-18 16:08:59.837 [MAIN]
35(LONG)
DEBUG
PARAMETERS:
金
COM.POWERNODE.MYBATIS.MAPPER.CARMAPPER.SELECTBYID
2022-08-18 16:08:59.878 [MAIN] D
4] DEBUG COM.POWERNODE.MYBATIS.MAPPER.CARMAPPER.SELECTBYID
TOTAL: 1
',CARTYPE:'燃油车'}
CAR{ID-35, CARNUM三'103', BRAND:'奔驰E300L', GUIDEPRICE-50.3,
PRODUCETIME:'2020-10-01', CA
/**
* 根据id主键查询:结果最多只有一条,可以放到List集合中吗?
* @return
*/
List<Car> selectByIdToList(Long id);
<select id="selectByIdToList" resultType="Car">
select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car where id = #{id}
</select>
@Test
public void testSelectByIdToList(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = mapper.selectByIdToList(35L);
System.out.println(cars);
}
DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
[MAIN]
SETTING AUTOCOMMIT ING
2022-08-18 16:15:03.274
TO
DEBUG C.P.MYBATIS.MAPPER.CARMAPPER.SELECTBYIDTOLIST - - - - PREPARING: SELECT ID,GY
2022-08-18 16:15:03.277
[MAIN]
DEBUG C.P.MYBATIS.MAPPER.CARMAPPER.SELECTBYIDTOLIST - 三> PARAMETERS: 35(LONG)
2022-08-18
[MAIN]
16:15:03.310
TOTAL: 1
16:15:03.344
2022-08-18 1
[MAIN]
DEBUG C.P.MYBATIS.MAPPER.CARMAPPER.SELECTBYIDTOLIST - <三三
[CANFIDE35, CANNUME'103', BRAND三;奔输E30AL', QUIDEPRICE三50.3, PRODUCETINB三;2020-10-01', CARTYPAS'想油车]]
/**
* 查询所有的Car
* @return
*/
List<Car> selectAll();
<select id="selectAll" resultType="Car">
select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car
</select>
@Test
public void testSelectAll(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = mapper.selectAll();
cars.forEach(car -> System.out.println(car));
}
PREPARING: SELECT ID,CAR_NUM O
2022-08-18 17:45:58.340
DEBUG COM.POWERNODE.MYBATIS.MAPPER.CARMAPPER.SELECTALL
[MAIN]
出
2022-08-18 17:45:58.375
[MAIN] DEBUG CON
S COM.POWERNODE.MYBATIS.MAPPER.CARMAPPER.SELECTALL
PARAMETERS:
出
2022-88-18 17:45:58.422 [NAIN] DEBUG COM.POWERNODE.MYBATIS.MAPPER.CARHAPPER.SELECTALL
TOTAL:38
CARFID三33, CANNUA三'103', BRAND三-奔驰E300L', QUIDEFRICE-50.3, PRODUCETINE三;2020-10-01', CARTYPE三-燃油车]
CAR(ID-3G, CARNUNS'102', BRAND:'2018-10', GUIDEPRICES30,2S, PRODUCETIME;;2018-89-10', CARTYPE三'电车]电车]
E燃油车子
CARFID三35, CANIUN三'103', BRANDE;;奔驰E308L', GUIDEPRICAS58-3, PRADUCETIME三'2030-19-01', CARTYBEFTYBEF
CARFID三36, CARRUNE;103', BRAND三;奔驰C200', QUIDEPRICE三33,23,33, PRADUCETIME三;2828-11', CARTYPES-灌油车]]
CAR[ID:37, CANNUAS'183', BRAND:;奔验C200', GUIDEPRICE三33.23,23, PRODUCETINE三'2020-11', CARTYPE;'统油车]
CARFID三38, CANNUM三'133', BRAND:'(( CARTYPE三' QUIDEPRICE-50.3, PRODUCETINE三;2020-01-10', CARTYPE三'感油车]
/**
* 查询多条记录,采用单个实体类接收会怎样?
* @return
*/
Car selectAll2();
<select id="selectAll2" resultType="Car">
select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car
</select>
@Test
public void testSelectAll2(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
Car car = mapper.selectAll2();
System.out.println(car);
}
ORG.APACHE.IBATIS.EXCEPTIONS TOOMANYRESULTSEXCEPTION: EXPECTED ONE RESULT
38
SELECTONE()
BUT FOUND:
(OR NULL) TO BE RETURNED
AT ORG-APACHE.IBATIS,SESSION,DEFAULTS,DEFAULTSQLSQLSESSION,SELECTONE(DEFAULTSALSESSION,JAVA:8D)
AT ORG.APACHE.IBATIS.BINDING.MAPPERMETHOD.EXECUTE(MAPPERMETHOD.JAVA:87)
E ORG.APACHE.IBATIS.BINDING.HAPPERPROXYSPLAINHETHODINVOKER.INVOKE(HAPPERPROXY.JAVA:145)
AT ORG
AT ORG.APACHE.IBATIS.BINDING.MAPPERPROXY.INVOKE(MAPPERPROXY.JAVA:86)
AT JDK.PROXY2/JDK.PROXY2.$PROXY8.SELECTALL2(UNKNOWN SOURCE)
AT COM.POWERNODE-NYBATIS,TEST,CARNAPPERTESTEST.TESTSELECTALL2GARHANPERTEST-JAVA;10) <27 INTERNAL LINE
国
MAP集合
KEY
VALUE
ID
1001
CARNUM
奔驰E300L
IBRAND
50.5
GUIDEPRICE
PRODUCETIME
2010/11/11
燃油车
CARTYPE
/**
* 通过id查询一条记录,返回Map集合
* @param id
* @return
*/
Map<String, Object> selectByIdRetMap(Long id);
<select id="selectByIdRetMap" resultType="map">
select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car where id = #{id}
</select>
@Test
public void testSelectByIdRetMap(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
Map<String,Object> car = mapper.selectByIdRetMap(35L);
System.out.println(car);
}
SETTING AUTOCOMMIT TO FALSE
[MAIN] DEBUG ORG.APACHE.IBATIS.TRANSACTION.JDBC.JDBCTRANSACTION
2022-08-18 18:07:38.437 [M
JDBC
ON
MAP - 三> PREPARING: SELECT ID,CAR_NUM
2022-08-18 18:07:38.441
[MAIN] DEBUG C.P.MYBATIS.MAPPER.CARMAPPER.SELECTBYIDRETMAP
CARNUM
2022-08-18 18:07:38.480 [MAIN]
DEBUG C.P.MYBATIS.MAPPER.CARMAPPER.SELECTBYIDRETMAP
- 三三> PARAMETERS: 35(LONG)
TOTAL: 1
2022-08-18 18:07:38.518 [MAIN] DEBUG C.P.MYBATIS.MAPPER.CARMAPPER.SELECTBYIDRETMAP
{CARTYPE三撤油车, CARNUN-103, QUIDEPRICE-50.30,30, PRODUCETIME三2020-19-01, ID三35, BRAND三奔驰E300L)
D WITH EVIT CODE A
FINICHED W
PROCACC
LIST<MAP
MAP1
VALUE
KEY
ID
1
1001
CARNUM
奔驰E300L
BRAND
50.5
GUIDEPRICE
2010/11/11
PRODUCETIME
燃油车
CARTYPE
MAP2
KEY
YALUE
1002
CARNUN
丰田霸道
BRAND
30
GUIDEPRICE
2010/11/11
PRODUCETIME
燃油车
CARTYPE
MAP3
YALUE
KEY
ID
1003
CARNUN
凯美瑞
BRAND
20
GUIDEPRICE
2010/11/11
PRODUCETIME
燃油车
CARTYPE
/**
* 查询所有的Car,返回一个List集合。List集合中存储的是Map集合。
* @return
*/
List<Map<String,Object>> selectAllRetListMap();
<select id="selectAllRetListMap" resultType="map">
select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car
</select>
@Test
public void testSelectAllRetListMap(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Map<String,Object>> cars = mapper.selectAllRetListMap();
System.out.println(cars);
}
[
{carType=燃油车, carNum=103, guidePrice=50.30, produceTime=2020-10-01, id=33, brand=奔驰E300L},
{carType=电车, carNum=102, guidePrice=30.23, produceTime=2018-09-10, id=34, brand=比亚迪汉},
{carType=燃油车, carNum=103, guidePrice=50.30, produceTime=2020-10-01, id=35, brand=奔驰E300L},
{carType=燃油车, carNum=103, guidePrice=33.23, produceTime=2020-10-11, id=36, brand=奔驰C200},
......
]
MAP<STRING,MAP>
MAP1
VALUE
KEY
ID
1001
CARNUM
奔驰E300L
BRAND
50.5
GUIDEPRICE
2010/11/11
PRODUCERIME
燃油车
CARTYPE
MAP2
VALUE
KEY
ID
1002
CARNUN
丰田霸道
BRAND
30
GUIDEPRICE
PRODUCETIME
2010/11/11
燃油车
CARTYPE
MAP3
KEY
VALUE
ID
1003
CARNUN
凯美瑞
BRAND
20
GUIDEPRICE
2010/11/11
LPRODUCETIME
燃油车
CARTYPE
/**
* 获取所有的Car,返回一个Map集合。
* Map集合的key是Car的id。
* Map集合的value是对应Car。
* @return
*/
@MapKey("id")
Map<Long,Map<String,Object>> selectAllRetMap();
<select id="selectAllRetMap" resultType="map">
select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car
</select>
@Test
public void testSelectAllRetMap(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
Map<Long,Map<String,Object>> cars = mapper.selectAllRetMap();
System.out.println(cars);
}
{
64={carType=燃油车, carNum=133, guidePrice=50.30, produceTime=2020-01-10, id=64, brand=丰田霸道},
66={carType=燃油车, carNum=133, guidePrice=50.30, produceTime=2020-01-10, id=66, brand=丰田霸道},
67={carType=燃油车, carNum=133, guidePrice=50.30, produceTime=2020-01-10, id=67, brand=丰田霸道},
69={carType=燃油车, carNum=133, guidePrice=50.30, produceTime=2020-01-10, id=69, brand=丰田霸道},
......
}
/**
* 查询所有Car,使用resultMap进行结果映射
* @return
*/
List<Car> selectAllByResultMap();
<!--
resultMap:
id:这个结果映射的标识,作为select标签的resultMap属性的值。
type:结果集要映射的类。可以使用别名。
-->
<resultMap id="carResultMap" type="car">
<!--对象的唯一标识,官方解释是:为了提高mybatis的性能。建议写上。-->
<id property="id" column="id"/>
<result property="carNum" column="car_num"/>
<!--当属性名和数据库列名一致时,可以省略。但建议都写上。-->
<!--javaType用来指定属性类型。jdbcType用来指定列类型。一般可以省略。-->
<result property="brand" column="brand" javaType="string" jdbcType="VARCHAR"/>
<result property="guidePrice" column="guide_price"/>
<result property="produceTime" column="produce_time"/>
<result property="carType" column="car_type"/>
</resultMap>
<!--resultMap属性的值必须和resultMap标签中id属性值一致。-->
<select id="selectAllByResultMap" resultMap="carResultMap">
select * from t_car
</select>
@Test
public void testSelectAllByResultMap(){
CarMapper carMapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = carMapper.selectAllByResultMap();
System.out.println(cars);
}
<!--放在properties标签后面-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
/**
* 查询所有Car,启用驼峰命名自动映射
* @return
*/
List<Car> selectAllByMapUnderscoreToCamelCase();
<select id="selectAllByMapUnderscoreToCamelCase" resultType="Car">
select * from t_car
</select>
@Test
public void testSelectAllByMapUnderscoreToCamelCase(){
CarMapper carMapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = carMapper.selectAllByMapUnderscoreToCamelCase();
System.out.println(cars);
}
/**
* 获取总记录条数
* @return
*/
Long selectTotal();
<!--long是别名,可参考mybatis开发手册。-->
<select id="selectTotal" resultType="long">
select count(*) from t_car
</select>
@Test
public void testSelectTotal(){
CarMapper carMapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
Long total = carMapper.selectTotal();
System.out.println(total);
}
PREPARING: SELECT COUNT(*)
2022-08-19 10:02:45.943
FROM
DEBUG COM.POWERNODE.MYBATIS.MAPPER.CARHAPPER.SELECTTOTAL
T_CAR
[MAIN]
DEBUG COM.POWERNODE.MYBATIS.MAPPER.CARHAPPER.SELECTTOTAL
2022-08-19 10:02:45.976
[MAIN]
PARAMETERS:
个
2022-08-19 10:02:46.024 [MAIN] DE
HAIN] DEBUG COM.POWERNODE.MYBATIS.MAPPER.CARMAPPER.SELECTTOTAL
TOTAL: 1
38
N
全选
删除
张三
李四
王五
赵六
delete from t_car where id in(1,2,3,4,5,6,......这里的值是动态的,根据用户选择的id不同,值是不同的);
"手机"
运行内存:18GB
机身内存:1TB X
全部结果
品牌:APPLEX
骁龙4系列
CPU型号:
功能机
晓龙8+GEN1
晓龙8GEN1
A15
APPLEA系列
屏幕尺寸:
7英寸以上
6.0英寸以下
6.8-7.0英寸
6.0-6.29英寸
6.3-6.59英寸
6.6-6.79英寸
未上市
特征特质:
OLED直屏
屏幕指纹
5G
5001-5500MAH
电池容量:
4000-4499MAH
4500-5000MAH
3000-3999MAH
5500MAH以上
屏幕材质:
OLED折叠屏
OLED直屏
未上市
LTPS LCD
LCD
屏幕分辨率
三防标准
高级选项:
其他分类
后摄主像素
机身色系
充电功率
广告
夫
商品精选
综合!
新品
评论数
价格
销量
配送至北京东城区
京东物流
京东国际
仅显示有货
HUAWEI
货到付款
畅享20E
500CMAH大电池
6+128G大内存
搭载鸿源系统
¥969.00
select * from t_car where brand like '丰田%' and guide_price > 30 and .....;
package com.powernode.mybatis.mapper;
import com.powernode.mybatis.pojo.Car;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CarMapper {
/**
* 根据多条件查询Car
* @param brand
* @param guidePrice
* @param carType
* @return
*/
List<Car> selectByMultiCondition(@Param("brand") String brand, @Param("guidePrice") Double guidePrice, @Param("carType") String carType);
}
<mapper namespace="com.powernode.mybatis.mapper.CarMapper">
<select id="selectByMultiCondition" resultType="car">
select * from t_car where
<if test="brand != null and brand != ''">
brand like #{brand}"%"
</if>
<if test="guidePrice != null and guidePrice != ''">
and guide_price >= #{guidePrice}
</if>
<if test="carType != null and carType != ''">
and car_type = #{carType}
</if>
</select>
</mapper>
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.CarMapper;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtil;
import org.junit.Test;
import java.util.List;
public class CarMapperTest {
@Test
public void testSelectByMultiCondition(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = mapper.selectByMultiCondition("丰田", 20.0, "燃油车");
System.out.println(cars);
}
}
CREATED CONNECTION 367967231.
SOURCE
SETTING AUTOCOMMIT TO FALSE ON JDBC CONNECTION
[COM.MYSQL.CJ.JDBC.CONNECTIONIMPL@15EEBBF]
ACTION
?"%" AND GUIDE_PRICE >: ? AND CAR_TYPE
?
PREPARING: SELECT * FROM T_CAR WHERE BRAND LIKE
CAR
N
),燃油车(STRING)
PARAMETERS: 丰田(STRING), 20.0(DOUBLE), 少
N
TOTAL: 33
U
10', CARTYPE三'烧油车], CANFIDERRICESS, CANNUME'133',BRAND:;丰田输道",QUIDERRICES50.3, PRODUCETIME三;2929-01-1
List<Car> cars = mapper.selectByMultiCondition("", 20.0, "燃油车");
SETTING AUTOCOMMIT TO FALSE ON JDBC CONNECTION [COM.MYSQL.CJ.JDBC.CONNECTIONIMPLQISEEBBFF]
PREPARING: SELECT * FROM T_CAR
? AND CAR_TYPE
WHERE AND GUIDE PRICE
VU
PARAMETERS:20.0(DOUBLE),燃油车(STRING)
IN YOUR SQL SYNTAX; CHECK THE MANUAL THAT CORRESPONDS TO YOUR HYSQL SERVERVER VERSION FOR THE I
<SELECT ID-"SELECTBYMULTICONDITION"
RESULTYPE-"CAR">
O
SELECT * FROM T_CAR WHERE
<IF
TEST:"BRAND !: NULL A
LL AND BRAND !: "">
|BRAND LIKE #{BRAND}"%"
AND
</IF>
<IF TEST:"GUIDEPRICE !- NULL AND GUIDEPRICE !: ''">
AND GUIDE_PRICE >: #{GUIDEPRICE}
</IF>
<IF TEST:"CARTYPE !: NULL AND CU
D CARTYPE
#{CARTYPE}
CAR_TYPE
AND
</IF>
</SELECT>
- SETTING AUTOCOMMIT TO FALSE ON JDEC CONNECTION [COM.MYSQL.CJ.JDBC.CONNECTIONIMPLOISEEBBFF]
PREPARING: SELECT * FROM T-CARIWHERE O - O AND GUIDE-PRICE >: ? AND CAR-TYPE ;?
PARAMETERS:20.0(DOUBLE),燃油车(STRING)
TOTAL: 37
CARTYPE:: CAM;', CAMLIDEPRICES5, PRODUCETINE;(202), PRAND三;, GUIDEPRICES50.3, PRODUCETINE;;2029
List<Car> cars = mapper.selectByMultiCondition("", null, "");
JDBC CONNECTION [COM.MYSD
CTION - SETTING AUTOCOMMIT TO FALSE
ON
SE> PREPARING:SELECT
FROM
T_CAR
WHERE
E> PARAMETERS:
TOTAL: 38
-01',CARTYPE;'燃油车'},CAR{ID-34, CARNUM三'102',BRAND;'比亚迪汉'
List<Car> cars = mapper.selectByMultiCondition("丰田", 20.0, "燃油车");
LCOM.MYSQL.CJ.JABC.CONNECTIONLMPLQL5EEBBFFF
SETTING AUTOCOMMIT TO FALSE ON JDBC CONNECT
PREPARING: SELECT * FROM T_CAR WHERE O
BRAND LIKE ?"%" AND GUIDE-PRICE >: ? AND CAR_TYPE
AND
RARAMETERS:丰田(STRING),20.0(DOUBLE),燃油车(STNING)
TOTAL: 33
第一个条件前面也要加AND
GUIDEPRICE-50.3, PRODUCETIME:'2020-01-10', CART
YPE:'燃油车},CAR{ID-39,CARNUM三'133',BRAND:'丰田霸道
/**
* 根据多条件查询Car,使用where标签
* @param brand
* @param guidePrice
* @param carType
* @return
*/
List<Car> selectByMultiConditionWithWhere(@Param("brand") String brand, @Param("guidePrice") Double guidePrice, @Param("carType") String carType);
<select id="selectByMultiConditionWithWhere" resultType="car">
select * from t_car
<where>
<if test="brand != null and brand != ''">
and brand like #{brand}"%"
</if>
<if test="guidePrice != null and guidePrice != ''">
and guide_price >= #{guidePrice}
</if>
<if test="carType != null and carType != ''">
and car_type = #{carType}
</if>
</where>
</select>
@Test
public void testSelectByMultiConditionWithWhere(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = mapper.selectByMultiConditionWithWhere("丰田", 20.0, "燃油车");
System.out.println(cars);
}
G AUTOCOMMIT TO FALSE ON JDBC CONNECTION [COM.MYSQL.CI.IDBC.CONNECTIONIMPLA4F071DF8]
SETTING
PREPARING: SELECT * FROM T.CARL WHERE BRAND LIKE ?"&" AND GUIDE-PRICE > ? AND CAR-TYPE
PARAMETERS:丰田(STRING),20.0(DOUBLE),燃油车(STRING)
TOTAL: 33
1177! BAND-L士巴雷诺!
2 SNADUEATIME-L0A0A A4 101
LATTI
CAN SD-ZO
List<Car> cars = mapper.selectByMultiConditionWithWhere("", null, "");
JDBC CONNECTION
SETTING AUTOCOMMIT TO FALSE ON
PREPARING:
SELECT * FROM T_CAR
金
三> PARAMETERS:
TOTAL: 38
List<Car> cars = mapper.selectByMultiConditionWithWhere("丰田", 20.0, "燃油车");
<select id="selectByMultiConditionWithWhere" resultType="car">
select * from t_car
<where>
<if test="brand != null and brand != ''">
or brand like #{brand}"%"
</if>
<if test="guidePrice != null and guidePrice != ''">
and guide_price >= #{guidePrice}
</if>
<if test="carType != null and carType != ''">
and car_type = #{carType}
</if>
</where>
</select>
JDBC CONNECTION
UTOCOMMIT
FALSE
TO
[COM.MYSQL.CJ.JDBC.CONNECTIONIMPL@4F071DF8]
ON
LIKE
IRING: SELECT
? %
WHERE BRAND LI
AND
CAR TYPE
AND GUIDE_PRICE >;
FROM
T_CAR
ETERS:丰田(STRING),20.0(DOUBLE),燃油车(STRING)
OTAL:33
BRAND-主田露道!
CARNUM-'133
车'LAPSJD-39
A M
NRODUCETIME-'2020-01-11
GUIDEPRICE-5A
<select id="selectByMultiConditionWithWhere" resultType="car">
select * from t_car
<where>
<if test="brand != null and brand != ''">
brand like #{brand}"%" and
</if>
<if test="guidePrice != null and guidePrice != ''">
guide_price >= #{guidePrice} and
</if>
<if test="carType != null and carType != ''">
car_type = #{carType}
</if>
</where>
</select>
// 让最后一个条件为空
List<Car> cars = mapper.selectByMultiConditionWithWhere("丰田", 20.0, "");
AUTOCOMMIT TO FALSE ON JDBC CONNECTION [COM.MYSQL.CJ.JDBC.CONNECTIONIMPLQ4F071DF8]
ING
PREPARING: SELECT * FROM T_CAR WHERE BRAND LIKE ?"%" AND GUIDE-PRICE >二
AND
PARAMETERS: 丰田(STRING), 20.0(DOUBLE)
MYSQL SERVER VERSION FOR THE RIGHT SY
SQL SYNTAX; CHECK THE MANUAL THAT CORRESPONDS TO YOUR
DUR
/**
* 根据多条件查询Car,使用trim标签
* @param brand
* @param guidePrice
* @param carType
* @return
*/
List<Car> selectByMultiConditionWithTrim(@Param("brand") String brand, @Param("guidePrice") Double guidePrice, @Param("carType") String carType);
<select id="selectByMultiConditionWithTrim" resultType="car">
select * from t_car
<trim prefix="where" suffixOverrides="and|or">
<if test="brand != null and brand != ''">
brand like #{brand}"%" and
</if>
<if test="guidePrice != null and guidePrice != ''">
guide_price >= #{guidePrice} and
</if>
<if test="carType != null and carType != ''">
car_type = #{carType}
</if>
</trim>
</select>
@Test
public void testSelectByMultiConditionWithTrim(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
List<Car> cars = mapper.selectByMultiConditionWithTrim("丰田", 20.0, "");
System.out.println(cars);
}
SETTING AUTOCOMMIT TO FALSE ON JDBC CONNECTION LE
ON [COM.MYSQL.CJ.JDBC.CONNECTIONIMPL@4DE41AF9]
PREPARING: SELECT * FROM T-CAR WHERE BRAND LIKE ?"%" AND GUIDE_PRICE >; ?
八十
, PARAMETERS: 丰田(STRING), 20.0(DOUBLE)
TOTAL: 33
List<Car> cars = mapper.selectByMultiConditionWithTrim("", null, "");
SETTING AUTOCOMMIT TO FALSE ON JDBC CONNECTI
PREPARING: SELECT * FROM T_CAR
> PARAMETERS:
TOTAL: 38
/**
* 更新信息,使用set标签
* @param car
* @return
*/
int updateWithSet(Car car);
<update id="updateWithSet">
update t_car
<set>
<if test="carNum != null and carNum != ''">car_num = #{carNum},</if>
<if test="brand != null and brand != ''">brand = #{brand},</if>
<if test="guidePrice != null and guidePrice != ''">guide_price = #{guidePrice},</if>
<if test="produceTime != null and produceTime != ''">produce_time = #{produceTime},</if>
<if test="carType != null and carType != ''">car_type = #{carType},</if>
</set>
where id = #{id}
</update>
@Test
public void testUpdateWithSet(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
Car car = new Car(38L,"1001","丰田霸道2",10.0,"",null);
int count = mapper.updateWithSet(car);
System.out.println(count);
SqlSessionUtil.openSession().commit();
}
EATED CONNECTION 1149407083.
N JDBC CONNECTION [COM.MYSQL.CJ.JDBC.CONNECTIONIMPLQ44828F6B]
ETTING AUTOCOMMIT TO FALSE O
SE ON JDBC
R SET CAR_NUM
BRAND ; ?, GUIDE_PRICE ; ? WHERE ID ; ?
PREPARING: UPDATE T_CAR
2 PARAMETERS:1001(STRING),丰田霸道2(STRING), 10.0(DOUBLE), 38(LONG)
UPDATES: 1
<choose>
<when></when>
<when></when>
<when></when>
<otherwise></otherwise>
</choose>
if(){
}else if(){
}else if(){
}else if(){
}else{
}
/**
* 使用choose when otherwise标签查询
* @param brand
* @param guidePrice
* @param produceTime
* @return
*/
List<Car> selectWithChoose(@Param("brand") String brand, @Param("guidePrice") Double guidePrice, @Param("produceTime") String produceTime);
<select id="selectWithChoose" resultType="car">
select * from t_car
<where>
<choose>
<when test="brand != null and brand != ''">
brand like #{brand}"%"
</when>
<when test="guidePrice != null and guidePrice != ''">
guide_price >= #{guidePrice}
</when>
<otherwise>
produce_time >= #{produceTime}
</otherwise>
</choose>
</where>
</select>
@Test
public void testSelectWithChoose(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
//List<Car> cars = mapper.selectWithChoose("丰田霸道", 20.0, "2000-10-10");
//List<Car> cars = mapper.selectWithChoose("", 20.0, "2000-10-10");
//List<Car> cars = mapper.selectWithChoose("", null, "2000-10-10");
List<Car> cars = mapper.selectWithChoose("", null, "");
System.out.println(cars);
}
SACTION - SETTING AUTOCOMMIT TO FALSE ON JDBC CONNECTION [COM.MYSQL.CI
SE - >> PREPARING: SELECT * FROM T_CAR WHERE PRODUCE_TIME >; ?
PARAMETERS: (STRING)
SE - 三三>
TOTAL: 38
10-01', CARTYPE;'燃油车"}, CARFID-34,CARNUM;'102', BRAND三'比亚迪汉',GUI
delete from t_car where id in(1,2,3);
delete from t_car where id = 1 or id = 2 or id = 3;
insert into t_car values
(null,'1001','凯美瑞',35.0,'2010-10-11','燃油车'),
(null,'1002','比亚迪唐',31.0,'2020-11-11','新能源'),
(null,'1003','比亚迪宋',32.0,'2020-10-11','新能源')
/**
* 通过foreach完成批量删除
* @param ids
* @return
*/
int deleteBatchByForeach(@Param("ids") Long[] ids);
<!--
collection:集合或数组
item:集合或数组中的元素
separator:分隔符
open:foreach标签中所有内容的开始
close:foreach标签中所有内容的结束
-->
<delete id="deleteBatchByForeach">
delete from t_car where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
@Test
public void testDeleteBatchByForeach(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
int count = mapper.deleteBatchByForeach(new Long[]{40L, 41L, 42L});
System.out.println("删除了几条记录:" + count);
SqlSessionUtil.openSession().commit();
}
PREPARING: DELETE FROM T_CAR WHERE ID IN ( ? , ? , ? )
EACH - 三>
PARAMETERS: 40(LONG), 41(LONG), 42(LONG)
EACH - 三>
UPDATES: 3
EACH
SI IDHE CONNECTIONIMNLA300
TTING
INRS CANNEETION LEOM MVEGL
OMM
/**
* 通过foreach完成批量删除
* @param ids
* @return
*/
int deleteBatchByForeach2(@Param("ids") Long[] ids);
<delete id="deleteBatchByForeach2">
delete from t_car where
<foreach collection="ids" item="id" separator="or">
id = #{id}
</foreach>
</delete>
@Test
public void testDeleteBatchByForeach2(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
int count = mapper.deleteBatchByForeach2(new Long[]{40L, 41L, 42L});
System.out.println("删除了几条记录:" + count);
SqlSessionUtil.openSession().commit();
}
[COM.MYSQL.CJ.JDBC.CONN
JDBC
CONNECTION
FALSE ON
ING AUTOCOMMIT TO FA
PREPARING: DELETE FROM T_CAR WHERE ID : ? OR ID : ? OR ID : ?
PARAMETERS: 40(LONG), 41(LONG), 42(LONG)
UPDATES:0
/**
* 批量添加,使用foreach标签
* @param cars
* @return
*/
int insertBatchByForeach(@Param("cars") List<Car> cars);
<insert id="insertBatchByForeach">
insert into t_car values
<foreach collection="cars" item="car" separator=",">
(null,#{car.carNum},#{car.brand},#{car.guidePrice},#{car.produceTime},#{car.carType})
</foreach>
</insert>
@Test
public void testInsertBatchByForeach(){
CarMapper mapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
Car car1 = new Car(null, "2001", "兰博基尼", 100.0, "1998-10-11", "燃油车");
Car car2 = new Car(null, "2001", "兰博基尼", 100.0, "1998-10-11", "燃油车");
Car car3 = new Car(null, "2001", "兰博基尼", 100.0, "1998-10-11", "燃油车");
List<Car> cars = Arrays.asList(car1, car2, car3);
int count = mapper.insertBatchByForeach(cars);
System.out.println("插入了几条记录" + count);
SqlSessionUtil.openSession().commit();
}
COMMIT TO FALSE ON JDBC
CONNECTION [COM.MYSQL.CJ.JDBC.CONNECTIONIMPLA6E1D8F9E]
(NULL,?,?,?,?,?) , (NULL,?,?,?,?,?,?)
(NULL,?,?,?,?,?)
G: INSERT INTO T_CAR VALUES
S: 2091(STRING), 兰博基尼(STRING), 100.0(DOUBLE), 1998-10-11(STNING), 烧油车(STRING), 2001(STRING), 199
S:3
<sql id="carCols">id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType</sql>
<select id="selectAllRetMap" resultType="map">
select <include refid="carCols"/> from t_car
</select>
<select id="selectAllRetListMap" resultType="map">
select <include refid="carCols"/> carType from t_car
</select>
<select id="selectByIdRetMap" resultType="map">
select <include refid="carCols"/> from t_car where id = #{id}
</select>
N
T.CLAZZ@MYBATIS(LOCALHOST)-表
对象
目开始事务
目文本?筛选,三排序 [6导入[9导出
CID
CNAME
1001高三1班
1002高三2班
对象
T.STUDENT@MYBATIS(LOCALHOST)-表
文本?筛选,三排序
[6导入[
开始事务
SID
CID
SNAME
1张三
1001
2李四
1001
3王五
1001
4赵六
1002
5钱七
1002
package com.powernode.mybatis.pojo;
/**
* 学生类
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class Student {
private Integer sid;
private String sname;
//......
}
package com.powernode.mybatis.pojo;
/**
* 班级类
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class Clazz {
private Integer cid;
private String cname;
//......
}
package com.powernode.mybatis.pojo;
/**
* 学生类
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class Student {
private Integer sid;
private String sname;
private Clazz clazz;
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", clazz=" + clazz +
'}';
}
public Student() {
}
public Student(Integer sid, String sname) {
this.sid = sid;
this.sname = sname;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
<mapper namespace="com.powernode.mybatis.mapper.StudentMapper">
<resultMap id="studentResultMap" type="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<result property="clazz.cid" column="cid"/>
<result property="clazz.cname" column="cname"/>
</resultMap>
<select id="selectBySid" resultMap="studentResultMap">
select s.*, c.* from t_student s join t_clazz c on s.cid = c.cid where sid = #{sid}
</select>
</mapper>
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.StudentMapper;
import com.powernode.mybatis.pojo.Student;
import com.powernode.mybatis.utils.SqlSessionUtil;
import org.junit.Test;
public class StudentMapperTest {
@Test
public void testSelectBySid(){
StudentMapper mapper = SqlSessionUtil.openSession().getMapper(StudentMapper.class);
Student student = mapper.selectBySid(1);
System.out.println(student);
}
}
PREPARING: SELECT S.*, C.* FRO
08-22 10:18:41.058 [NAIN] DEBUG C.P.MYBATIS.MAPPER.STUDENTMAPPER.SELECTBYSID
08-22 10:18:41.092 [MAIN] DEBUG C.P.MYBATIS.MAPPER.STUDENTMAPPER.SELECTBYSID
PARAMETERS: 1(INTEGER)
SEEPTS
08-22 10:18:41.135 (MAIN] DEBUG C.P.MYBATIS.MAPPER.STUDENTMAPPER.SELECTBYSID - <三3
TOTAL: 1
STUDENT(SID-1, SNAME:'张三',CLAZZ-CLAZZ(CID-1001, CNAME;'高三1班'Y
<resultMap id="studentResultMap" type="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<association property="clazz" javaType="Clazz">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
</association>
</resultMap>
<resultMap id="studentResultMap" type="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<association property="clazz"
select="com.powernode.mybatis.mapper.ClazzMapper.selectByCid"
column="cid"/>
</resultMap>
<select id="selectBySid" resultMap="studentResultMap">
select s.* from t_student s where sid = #{sid}
</select>
package com.powernode.mybatis.mapper;
import com.powernode.mybatis.pojo.Clazz;
/**
* Clazz映射器接口
* @author 老杜
* @version 1.0
* @since 1.0
*/
public interface ClazzMapper {
/**
* 根据cid获取Clazz信息
* @param cid
* @return
*/
Clazz selectByCid(Integer cid);
}
<mapper namespace="com.powernode.mybatis.mapper.ClazzMapper">
<select id="selectByCid" resultType="Clazz">
select * from t_clazz where cid = #{cid}
</select>
</mapper>
15:00:45.128 三>
PREPARING: SELECT S.* FROM T_STUDENT S WHERE SID
PARAMETERS: 1(INTEGER)
15:00:45.160
金
PREPARING: SELECT * FROM T_CLAZZ WHERE CID -
ID ?
15:00:45.195
三::> PARAMETERS: 1001(INTEGER)
15:00:45.195
TOTAL: 1
15:00:45.198
TOTAL: 1
15:00:45.200
<resultMap id="studentResultMap" type="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<association property="clazz"
select="com.powernode.mybatis.mapper.ClazzMapper.selectByCid"
column="cid"
fetchType="lazy"/>
</resultMap>
public class StudentMapperTest {
@Test
public void testSelectBySid(){
StudentMapper mapper = SqlSessionUtil.openSession().getMapper(StudentMapper.class);
Student student = mapper.selectBySid(1);
//System.out.println(student);
// 只获取学生姓名
String sname = student.getSname();
System.out.println("学生姓名:" + sname);
}
}
PREPARING: SELECT S.* FROM T_STUDENT S WHERE SID ; ?
15:04:17.189 三三>
15:04:17.224 三三> PARAMETERS: 1(INTEGER)
TOTAL: 1
15:04:17.295
学生姓名:张三
public class StudentMapperTest {
@Test
public void testSelectBySid(){
StudentMapper mapper = SqlSessionUtil.openSession().getMapper(StudentMapper.class);
Student student = mapper.selectBySid(1);
//System.out.println(student);
// 只获取学生姓名
String sname = student.getSname();
System.out.println("学生姓名:" + sname);
// 到这里之后,想获取班级名字了
String cname = student.getClazz().getCname();
System.out.println("学生的班级名称:" + cname);
}
}
PREPARING: SELECT S.* FROM T_STUDENT S WHERE SID
15:05:00.967
PARAMETERS: 1(INTEGER)
15:05:01.002
入十
15:05:01.072
TOTAL: 1
学生姓名:张三
PREPARING:
NG: SELECT * FROM T_CLAZZ WHERE CID : ?
15:05:01.075
入山
PARAMETERS: 1001(INTEGER)
15:05:01.076
TOTAL: 1
15:05:01.079 <三
学生的班级名称:高三1班
设置(SETTINGS)
这是MVBAILS中级为重要的医控设置,它们会改变MYBATIS的运行时行为.下表指送了设置中各质设置的合义,默认值等.
设置名
描述
默认值
有效值
全局性地开启或关闭所有映射器配置文件中已配置的任何缓存.
CACHEENABLED
TRUE FALSE
TRUE
LAZYLOADINGENABLED
TRUE I FALSE
延迟加载的全局开关.当开启时,所有关联对象都会延迟加载,特定关联关系中可通过设置
FALSE
FETCHTYPE 属性来夏盖该项的开关状态.
开启时,任一方法的调用都会加载该对象的所有延迟加载属性,
FALSE(在3.4.1及之前的版本中默认为TRUE)
生.否则,每个延迟加载属性会按需加载
TRUE FALSE
AGGRESSIVELAZYLOADING
(参考 LAZYLOADTRIGGERLETHODS).
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
public class StudentMapperTest {
@Test
public void testSelectBySid(){
StudentMapper mapper = SqlSessionUtil.openSession().getMapper(StudentMapper.class);
Student student = mapper.selectBySid(1);
//System.out.println(student);
// 只获取学生姓名
String sname = student.getSname();
System.out.println("学生姓名:" + sname);
// 到这里之后,想获取班级名字了
String cname = student.getClazz().getCname();
System.out.println("学生的班级名称:" + cname);
}
}
PREPARING: SELECT S.* FROM T_STUDENT S WHERE SID
15:05:00.967
PARAMETERS: 1(INTEGER)
15:05:01.002
入十
15:05:01.072
TOTAL: 1
学生姓名:张三
PREPARING:
NG: SELECT * FROM T_CLAZZ WHERE CID : ?
15:05:01.075
入山
PARAMETERS: 1001(INTEGER)
15:05:01.076
TOTAL: 1
15:05:01.079 <三
学生的班级名称:高三1班
<resultMap id="studentResultMap" type="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<association property="clazz"
select="com.powernode.mybatis.mapper.ClazzMapper.selectByCid"
column="cid"
fetchType="eager"/>
</resultMap>
PREPARING: SELECT S.* FROM T_STUDENT S WHERE SID : ?
15:06:13.955
15:06:13.990
PARAMETERS: 1(INTEGER)
入十中
PREPARING: SELECT * FROM T_CLAZZ WHERE CID : ?
15:06:14.027
15:06:14.028
PARAMETERS: 1001(INTEGER)
TOTAL: 1
15:06:14.031
TOTAL: 1
15:06:14.033
学生姓名:张三
学生的班级名称:高三1班
public class Clazz {
private Integer cid;
private String cname;
private List<Student> stus;
// set get方法
// 构造方法
// toString方法
}
package com.powernode.mybatis.mapper;
import com.powernode.mybatis.pojo.Clazz;
/**
* Clazz映射器接口
* @author 老杜
* @version 1.0
* @since 1.0
*/
public interface ClazzMapper {
/**
* 根据cid获取Clazz信息
* @param cid
* @return
*/
Clazz selectByCid(Integer cid);
/**
* 根据班级编号查询班级信息。同时班级中所有的学生信息也要查询。
* @param cid
* @return
*/
Clazz selectClazzAndStusByCid(Integer cid);
}
<resultMap id="clazzResultMap" type="Clazz">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
<collection property="stus" ofType="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
</collection>
</resultMap>
<select id="selectClazzAndStusByCid" resultMap="clazzResultMap">
select * from t_clazz c join t_student s on c.cid = s.cid where c.cid = #{cid}
</select>
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.ClazzMapper;
import com.powernode.mybatis.pojo.Clazz;
import com.powernode.mybatis.utils.SqlSessionUtil;
import org.junit.Test;
public class ClazzMapperTest {
@Test
public void testSelectClazzAndStusByCid() {
ClazzMapper mapper = SqlSessionUtil.openSession().getMapper(ClazzMapper.class);
Clazz clazz = mapper.selectClazzAndStusByCid(1001);
System.out.println(clazz);
}
}
14:27:55.532
JOIN T_STUDENT
PREPARING: SELECT * FROM T_CLAZZ C
WHEREC.CID
PT
入十八
CID : S.C1
14:27:55.576 三> PARAMETERS: 1001(INTEGER)
14:27:55.627 <SS
TOTAL:3
<resultMap id="clazzResultMap" type="Clazz">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
<!--主要看这里-->
<collection property="stus"
select="com.powernode.mybatis.mapper.StudentMapper.selectByCid"
column="cid"/>
</resultMap>
<!--sql语句也变化了-->
<select id="selectClazzAndStusByCid" resultMap="clazzResultMap">
select * from t_clazz c where c.cid = #{cid}
</select>
/**
* 根据班级编号获取所有的学生。
* @param cid
* @return
*/
List<Student> selectByCid(Integer cid);
<select id="selectByCid" resultType="Student">
select * from t_student where cid = #{cid}
</select>
14:53:24,912 EE>
PREPARING: SELECT * FROM T_CLAZZ C WHERE C.CID
14:53:24.950
PARAMETERS:1001(INTEGER)
入十川
TOTAL:1
14:53:25.022
PREPARING:SELECT * FROM T_STUDENT WHERE CID ;
14:53:25.024 三>
14:53:25.025 三3> PARAMETERS: 1001(INTEGER)
14:53:25.027 <
TOTAL:3
N
package com.powernode.mybatis.mapper;
import com.powernode.mybatis.pojo.Car;
public interface CarMapper {
/**
* 根据id获取Car信息。
* @param id
* @return
*/
Car selectById(Long id);
}
<mapper namespace="com.powernode.mybatis.mapper.CarMapper">
<select id="selectById" resultType="Car">
select * from t_car where id = #{id}
</select>
</mapper>
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.CarMapper;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
public class CarMapperTest {
@Test
public void testSelectById() throws Exception{
// 注意:不能使用我们封装的SqlSessionUtil工具类。
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = builder.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession1 = sqlSessionFactory.openSession();
CarMapper mapper1 = sqlSession1.getMapper(CarMapper.class);
Car car1 = mapper1.selectById(83L);
System.out.println(car1);
CarMapper mapper2 = sqlSession1.getMapper(CarMapper.class);
Car car2 = mapper2.selectById(83L);
System.out.println(car2);
SqlSession sqlSession2 = sqlSessionFactory.openSession();
CarMapper mapper3 = sqlSession2.getMapper(CarMapper.class);
Car car3 = mapper3.selectById(83L);
System.out.println(car3);
CarMapper mapper4 = sqlSession2.getMapper(CarMapper.class);
Car car4 = mapper4.selectById(83L);
System.out.println(car4);
}
}
sqlSession.clearCache();
/**
* 保存账户信息
*/
void insertAccount();
<insert id="insertAccount">
insert into t_act values(3, 'act003', 10000)
</insert>
<cache/>
public class Car implements Serializable {
//......
}
@Test
public void testSelectById2() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession1 = sqlSessionFactory.openSession();
CarMapper mapper1 = sqlSession1.getMapper(CarMapper.class);
Car car1 = mapper1.selectById(83L);
System.out.println(car1);
// 关键一步
sqlSession1.close();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
CarMapper mapper2 = sqlSession2.getMapper(CarMapper.class);
Car car2 = mapper2.selectById(83L);
System.out.println(car2);
}
<!--mybatis集成ehcache的组件-->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.2</version>
</dependency>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<!--磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存-->
<diskStore path="e:/ehcache"/>
<!--defaultCache:默认的管理策略-->
<!--eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断-->
<!--maxElementsInMemory:在内存中缓存的element的最大数目-->
<!--overflowToDisk:如果内存中数据超过内存限制,是否要缓存到磁盘上-->
<!--diskPersistent:是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false-->
<!--timeToIdleSeconds:对象空闲时间(单位:秒),指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问-->
<!--timeToLiveSeconds:对象存活时间(单位:秒),指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问-->
<!--memoryStoreEvictionPolicy:缓存的3 种清空策略-->
<!--FIFO:first in first out (先进先出)-->
<!--LFU:Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存-->
<!--LRU:Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存-->
<defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>
</ehcache>
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
@Test
public void testSelectById2() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession1 = sqlSessionFactory.openSession();
CarMapper mapper1 = sqlSession1.getMapper(CarMapper.class);
Car car1 = mapper1.selectById(83L);
System.out.println(car1);
sqlSession1.close();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
CarMapper mapper2 = sqlSession2.getMapper(CarMapper.class);
Car car2 = mapper2.selectById(83L);
System.out.println(car2);
}
N
<!--定制构建过程-->
<build>
<!--可配置多个插件-->
<plugins>
<!--其中的一个插件:mybatis逆向工程插件-->
<plugin>
<!--插件的GAV坐标-->
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.1</version>
<!--允许覆盖-->
<configuration>
<overwrite>true</overwrite>
</configuration>
<!--插件的依赖-->
<dependencies>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<generatorConfiguration>
<!--
targetRuntime有两个值:
MyBatis3Simple:生成的是基础版,只有基本的增删改查。
MyBatis3:生成的是增强版,除了基本的增删改查之外还有复杂的增删改查。
-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--防止生成重复代码-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
<commentGenerator>
<!--是否去掉生成日期-->
<property name="suppressDate" value="true"/>
<!--是否去除注释-->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--连接数据库信息-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/powernode"
userId="root"
password="root">
</jdbcConnection>
<!-- 生成pojo包名和位置 -->
<javaModelGenerator targetPackage="com.powernode.mybatis.pojo" targetProject="src/main/java">
<!--是否开启子包-->
<property name="enableSubPackages" value="true"/>
<!--是否去除字段名的前后空白-->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成SQL映射文件的包名和位置 -->
<sqlMapGenerator targetPackage="com.powernode.mybatis.mapper" targetProject="src/main/resources">
<!--是否开启子包-->
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成Mapper接口的包名和位置 -->
<javaClientGenerator
type="xmlMapper"
targetPackage="com.powernode.mybatis.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 表名和对应的实体类名-->
<table tableName="t_car" domainObjectName="Car"/>
</context>
</generatorConfiguration>
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.CarMapper;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.pojo.CarExample;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.List;
public class GeneratorTest {
@Test
public void testGenerator() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 增
/*Car car = new Car();
car.setCarNum("1111");
car.setBrand("比亚迪唐");
car.setGuidePrice(new BigDecimal(30.0));
car.setProduceTime("2010-10-12");
car.setCarType("燃油车");
int count = mapper.insert(car);
System.out.println("插入了几条记录:" + count);*/
// 删
/*int count = mapper.deleteByPrimaryKey(83L);
System.out.println("删除了几条记录:" + count);*/
// 改
// 根据主键修改
/*Car car = new Car();
car.setId(89L);
car.setGuidePrice(new BigDecimal(20.0));
car.setCarType("新能源");
int count = mapper.updateByPrimaryKey(car);
System.out.println("更新了几条记录:" + count);*/
// 根据主键选择性修改
/*car = new Car();
car.setId(89L);
car.setCarNum("3333");
car.setBrand("宝马520Li");
car.setProduceTime("1999-01-10");
count = mapper.updateByPrimaryKeySelective(car);
System.out.println("更新了几条记录:" + count);*/
// 查一个
Car car = mapper.selectByPrimaryKey(89L);
System.out.println(car);
// 查所有
List<Car> cars = mapper.selectByExample(null);
cars.forEach(c -> System.out.println(c));
// 多条件查询
// QBC 风格:Query By Criteria 一种查询方式,比较面向对象,看不到sql语句。
CarExample carExample = new CarExample();
carExample.createCriteria()
.andBrandEqualTo("丰田霸道")
.andGuidePriceGreaterThan(new BigDecimal(60.0));
carExample.or().andProduceTimeBetween("2000-10-11", "2022-10-11");
mapper.selectByExample(carExample);
sqlSession.commit();
}
}
N
select
*
from
tableName ......
limit
(pageNum - 1) * pageSize, pageSize
package com.powernode.mybatis.mapper;
import com.powernode.mybatis.pojo.Car;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CarMapper {
/**
* 通过分页的方式获取Car列表
* @param startIndex 页码
* @param pageSize 每页显示记录条数
* @return
*/
List<Car> selectAllByPage(@Param("startIndex") Integer startIndex, @Param("pageSize") Integer pageSize);
}
<mapper namespace="com.powernode.mybatis.mapper.CarMapper">
<select id="selectAllByPage" resultType="Car">
select * from t_car limit #{startIndex},#{pageSize}
</select>
</mapper>
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.CarMapper;
import com.powernode.mybatis.pojo.Car;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.util.List;
public class PageTest {
@Test
public void testPage()throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 页码
Integer pageNum = 2;
// 每页显示记录条数
Integer pageSize = 3;
// 起始下标
Integer startIndex = (pageNum - 1) * pageSize;
List<Car> cars = mapper.selectAllByPage(startIndex, pageSize);
cars.forEach(car -> System.out.println(car));
sqlSession.commit();
sqlSession.close();
}
}
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.1</version>
</dependency>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
List<Car> selectAll();
<select id="selectAll" resultType="Car">
select * from t_car
</select>
@Test
public void testPageHelper() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
// 开启分页
PageHelper.startPage(2, 2);
// 执行查询语句
List<Car> cars = mapper.selectAll();
// 获取分页信息对象
PageInfo<Car> pageInfo = new PageInfo<>(cars, 5);
System.out.println(pageInfo);
}
PageInfo{
pageNum=2, pageSize=2, size=2, startRow=3, endRow=4, total=6, pages=3,
list=Page{count=true, pageNum=2, pageSize=2, startRow=2, endRow=4, total=6, pages=3, reasonable=false, pageSizeZero=false}
[Car{id=86, carNum='1234', brand='丰田霸道', guidePrice=50.5, produceTime='2020-10-11', carType='燃油车'},
Car{id=87, carNum='1234', brand='丰田霸道', guidePrice=50.5, produceTime='2020-10-11', carType='燃油车'}],
prePage=1, nextPage=3, isFirstPage=false, isLastPage=false, hasPreviousPage=true, hasNextPage=true,
navigatePages=5, navigateFirstPage=1, navigateLastPage=3, navigatepageNums=[1, 2, 3]
}
N
package com.powernode.mybatis.mapper;
import com.powernode.mybatis.pojo.Car;
import org.apache.ibatis.annotations.Insert;
public interface CarMapper {
@Insert(value="insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})")
int insert(Car car);
}
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.CarMapper;
import com.powernode.mybatis.pojo.Car;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
public class AnnotationTest {
@Test
public void testInsert() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Car car = new Car(null, "1112", "卡罗拉", 30.0, "2000-10-10", "燃油车");
int count = mapper.insert(car);
System.out.println("插入了几条记录:" + count);
sqlSession.commit();
sqlSession.close();
}
}
@Delete("delete from t_car where id = #{id}")
int deleteById(Long id);
@Test
public void testDelete() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
mapper.deleteById(89L);
sqlSession.commit();
sqlSession.close();
}
@Update("update t_car set car_num=#{carNum},brand=#{brand},guide_price=#{guidePrice},produce_time=#{produceTime},car_type=#{carType} where id=#{id}")
int update(Car car);
@Test
public void testUpdate() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Car car = new Car(88L,"1001", "凯美瑞", 30.0,"2000-11-11", "新能源");
mapper.update(car);
sqlSession.commit();
sqlSession.close();
}
@Select("select * from t_car where id = #{id}")
@Results({
@Result(column = "id", property = "id", id = true),
@Result(column = "car_num", property = "carNum"),
@Result(column = "brand", property = "brand"),
@Result(column = "guide_price", property = "guidePrice"),
@Result(column = "produce_time", property = "produceTime"),
@Result(column = "car_type", property = "carType")
})
Car selectById(Long id);
@Test
public void testSelectById() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper carMapper = sqlSession.getMapper(CarMapper.class);
Car car = carMapper.selectById(88L);
System.out.println(car);
}
314 人点赞
99+